Одним из интересных свойств системы типов Haskell (*) является то, что иногда вы можете сказать точно, что делает функция, основываясь только на ее сигнатуре типа (при условии, что не задействована unsafe IO
темная магия).
Например, любая функция с сигнатурой типа a -> a
должна быть функцией идентификации, а любая функция типа (a,b) -> a
эквивалентна fst
. В некоторых случаях вы не можете определить функцию полностью: существует бесконечное количество различных возможных функций типа a -> Int
, но все они константы — все они игнорируют первый параметр.
Я нахожу это свойство захватывающим, но подозреваю, что оно применимо только к "тривиальным" функциям, таким как id
и const
. Я прав?
Кроме того, мои рассуждения здесь основаны только на интуиции - например, в a -> a
мы "ничего не знаем" о a
(в отличие от функций с ограничениями, таких как Num a => a -> a
), поэтому "не можем ничего сделать" с ним, кроме как вернуть без изменений. Есть ли формальный способ справиться с такого рода вычетами?
* Я знаю, что система типов Haskell основана на системе типов Хиндли-Милнера, но я недостаточно знакома с ней, чтобы делать какие-либо предположения
\x -> undefined
можно присвоить сигнатуру типаa -> a
. - person Neil Forrester   schedule 24.05.2014undefined
, и действительно, преобразования программ, основанные на параметричности, несостоятельны при наличии такой функции, какseq
. См. также Бесплатные теоремы в присутствии *seq [PDF] - person Rein Henrichs   schedule 24.05.2014a -> ⊥
- person Benesh   schedule 24.05.2014forall a. a -> a
. - person Rein Henrichs   schedule 24.05.2014