Следующие уравнения написаны в синтаксисе Miranda, но из-за сходства между Miranda и Haskell я ожидаю, что программисты на Haskell должны его понять!
Если вы определяете следующие функции:
rc v g i = g (v:i)
rn x = x
rh g = hd (g [])
f [] y = y
f (x:xs) y = f xs (rc x y)
g [] y = y
g (x:xs) y = g xs (x:y)
Как определить тип функций? Я думаю, что понимаю, как это сделать для f, g и rn, но я запутался в части частичного приложения.
rn будет * -> *( или что-нибудь -> что угодно, я думаю, что это -> a в Haskell? )
Для f и g функции оба типа [*] -> * -> *?
Однако я не знаю, как подойти к поиску типов для rc и rh. В rc g частично применяется к переменной i, поэтому я предполагаю, что это ограничивает тип i как [*]. В каком порядке rc и g применяются в определении rc? Применяется ли g к i, а затем полученная функция используется в качестве аргумента для rc? Или rc принимает 3 отдельных параметра v, g и i? Я действительно смущен .. любая помощь будет оценена! Спасибо, парни.
Извините, забыл добавить, что hd является стандартной функцией заголовка для списка и определяется как:
hd :: [*] -> *
hd (a:x) = a
hd [] = error "hd []"