Lev Walkin (lionet) wrote,

Хаскель как инструмент пролетариата

Иван gliv показал, как он решал задания для #aiclass. На Хаскеле.
$ cat hw2_1.hs 

p("a") = 0.5
p("~a") = 1 - p("a")
p("b|a") = 0.2
p("b|~a") = 0.8

p("b") = p("b|a") * p("a") + p("b|~a") * p("~a") -- = 0.5

p("a|b") = p("b|a") * p("a") / p("b") -- = 0.2

res = p("a|b")

С точки зрения тупого усиления интеллекта, это гениальная вещь в своей простоте. Использовать паттерн-матчинг в качестве механизма макросов. Оценил.

Расскажу тогда, как я таким же крестьянско-пролетарским способом решал лямбда-пазл сами знаете откуда. Для того, чтобы фан не выдавать, приведённый ниже хаскелевый код содержит ошибки.

Итак, имеем .Net экзешник, который в рефлекторе выглядит вот так:


(клик!)

Как это может выглядеть на исходном языке, я даже представить не берусь: мои знания C# заканчиваются на версии ECMA C# 2.0, и этих ваших лямбд там не было, насколько я помню. Но понятно, что примерно семантику этих Func<int,int> можно самым циничным образом угадать: один из аргументов (какой?) является возвращаемым значением, другой(-ие) — входными параметрами.

В итоге, потихоньку читая .Net код в рефлекторе, начал записывать мою интерпретацию в текстовый файл... который сразу оказался в Хаскелевой нотации почему-то. Чисто случайно, так сказать.
b3 n = b4
    where
        b4 f x = f (n f x)

b5 n m = b6
    where
        b6 f x = n f (m f x)

toint n = n b0 0

Написав такое, я понял, что его, наверное, можно просто скомпилировать, и не ошибся. Дописав файл и запустив его в интерпретаторе ghci, получил нужный результат.
main = putStrLn $ "bit.ly/" ++ show num
  where
    f = b2
    f2 = b3
    f3 = b5
    n = f2 $ f2 $ f2 f
    f5 = f2 $ f3 n n 
    f6 = f2 $ f2 $ f3 f5 f5
    f7 = f2 $ f3 f6 f6
    f8 = f2 $ f2 $ f3 f7 f7
    f9 = f2 $ f3 f8 f8
    num = ((((toint(n) * toint(f5)) * toint(f6)) * toint(f7)) * toint(f8)) * toint(f9)

Интересно, как это записывалось изначально в исходниках (C#?) этого .Net экзешника? Неужто также коротко? Или там какой-нибудь Nemerle? Потому что Рефлектор демонстрирует совсем что-то негуманное.
Tags: haskell
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded  

  • 42 comments