Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function e($name, $value='') { return "<$name>$value</$name>"; } print e('root', e('one', 1).e('two', 2));
да ладно вам сказки рассказывать… компилируется значит работает? старо предание, да верится с трудом…
head []
и получить ошибку во время исполнения, то dependent types это пресекут.Разве что тулзу на нём не написать, но речь была не об этом, а о возможностях total fp.
Do we want languages where a PhD (and two PhDs for Haskell) is required to understand the library documentation?
Is it better for Jane Programmer to write ~20 more or less correct lines of code / day or ~0 perfect ones?
Всё зависит от способностей total checker'а.
никакой theorem prover не сможет проанализировать типичный императивный mess, где память рандомно пишется-читается из десятков потоков
код на Haskell — разделён так, что подавляющую часть программы можно верифицировать формальными методами
все говорят «я не могу» — «а ты возьми и купи слона!» ©
все говорят «я не могу» — «а ты возьми и купи слона!» ©
они допустимы только там, где можно доказать их завершимость
если доказать нельзя — рефакторим код так, чтобы доказывалось
в математическом смысле, проще
неспроста раньше в курсе SICP языком был Scheme (почему сейчас не так — это отдельная история)
Чистота — можно не пользоваться императивными возможностями языков, которые их предоставляеют.
всяких классов типов
по-моему, тут вы что-то путаете, т.к. из ФЯ ленив по умолчанию только Haskell
Мне хватает того факта, что вероятность есть, и она выше, например, вероятности угадать 5-ти символьный пароль с первого раза
вообще говоря, в GHC, который использовал я был один фатальный недостаток — он не умел в compile-time обнаруживать неполные паттерны
-fwarn-incomplete-patterns
и уж тем более баги в алгоритмике программы — тут, извините, язык ни при чём
функция работает как часы
функция работает как часы, но эти часы вполне могут показывать неправильное время
ghci> let max2 x = max 2 x
ghci> :t max2
max2 :: (Ord t, Num t) -> t -> t
ghci> :t max
max :: (Ord a) => a -> a -> a
Таким образом, max определён для любого a (принадлежащего к классу Ord), принимает два аргумента одного типа и возвращает результат того же типа.
Но тип функции можно представить и так:
max :: (Ord a) => a -> (a -> a)
И тут мы встречаем currying. Получается, что max принимает один аргумент и возвращает функцию типа (a -> a).
Любую функцию можно представить, как принимающую один аргумент и возвращающую другую функцию.
mymax :: (Num a) => a -> a
-- здесь уже нужен Num, потому что в определении мы используем литерал 10, а он имеет тип (Num a) => a
mymax = max 10
test = mymax 0 -- 10
test2 = mymax 20 -- 20
Что означает запись «max :: (Ord a) => a -> (a -> a)»?
max :: (Ord a) => a -> (a -> a)
-- полностью эквивалентно max :: Ord a => a -> a -> a
Основы