Определение типа функции в функциональном программировании

Следующие уравнения написаны в синтаксисе 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 []"
5
задан user1058210 30 March 2012 в 17:19
поделиться