Мой вопрос - о том, как аналитически работать с сигнатурами типа Haskell. Для того, чтобы сделать бетон, я смотрю на функции «исправления»:Упростить подписи типа Haskell
fix :: (a -> a) -> a
и немного выдуманные функции, которую я написал, чтобы сделать Пеано-иш дополнения:
add = \rec a b -> if a == 0 then b else rec (a-1) (b+1)
Когда я анализирую типы, я получу ожидаемый тип для fix add
:
fix add :: Integer -> Integer -> Integer
И это, кажется, работает, как я ожидал:
> (fix add) 1 1
2
Как я могу работать с типом сигнатур для fix
и для add
, чтобы показать, что у fix add
есть подпись подписи? Что такое «алгебраический», если это даже правильное слово, правила работы с типом подписей? Как я могу «показать свою работу»?
Спасибо! Я работал так же (что 'a' в' fix' должно быть '(a -> a -> a)'). Но разве еще не шаг? Есть ли промежуток между '((a -> a -> a) -> (a -> a -> a)) -> (a -> a -> a)' и 'a -> a -> a' ? – Chris
Да, вы частично применяете 'fix' для' add'. Полученная частично примененная функция имеет тип 'a -> a -> a' – cdk
@ twopoint718 Применение' fix' к 'add' удаляет' ((a -> a -> a) -> (a -> a -> a)) 'из типа' fix'. –