$ 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? Потому что Рефлектор демонстрирует совсем что-то негуманное.