У меня возникли трудности с пониманием типов в haskell. Рассмотрим следующие функции и рассмотрим их типы.Признание типов haskell
reduce f s [] = s
reduce f s (x:xs) = f x (reduce f s xs)
for m n f s = if m>n then s else for (m+1) n f (f m s)
comp f g x y = f x (g x y)
iter 0 f s = s
iter n f s = iter (n-1) f (f s)
Мы бы иметь что-то вроде:
reduce :: (t1 -> t -> t) -> t -> [t1] -> t
for :: (Ord a, Num a) => a -> a -> (a -> t -> t) -> t -> t
comp :: (t -> t2 -> t3) -> (t -> t1 -> t2) -> t -> t1 -> t3
iter :: (Num t) => t -> (t1 -> t1) -> t1 -> t1
То, что я не ясно понять, что в функции уменьшения е принимает два параметра, и для функции F снова принимает два параметра. Все, что я вижу, это то, что он принимает только один. Хорошо, если это будет что-то вроде этого:
for m n f s = if m>n then s else for (m+1) n f m n
Было бы более очевидным и легко признать, что е действительно принимает два параметра.
Мне интересно, существуют ли какие-либо способы или методы для вывода типов функций в haskell. В дополнение к этим примерам я бы попросил несколько разных примеров, чтобы я мог преодолеть эти трудности.
EDIT: В моих определениях случая функций заданы, я просто пытаюсь вывести их тип
Вы Tackling это неправильно. Всегда _start_ от типов и того, как вы планируете использовать конечную функцию, а затем подумайте о реализации. «О» в 'for' function' f' снова принимает два параметра. Все, что я вижу, это то, что он принимает только один »: насколько яснее, чем' (f m s) 'он может получить? Вы буквально кормите функцию двумя аргументами вручную. Или что вы имеете в виду? – leftaroundabout
Да, кажется, что так, но когда он приходит 'f (f m s)' он меня смущает – user2878007
'f (f m s)' является частью 'for (m + 1) n f (f m s)'. первый 'f' применяется к рекурсивному вызову' for'. Всегда помещайте типы в определения верхнего уровня. – Simon