2013-12-11 2 views
3

Очень популярная монада объяснение здесь:Какова функция связывания Haskell?

http://blog.sigfpe.com/2007/04/trivial-monad.html

Я получаю все, кроме части:

bind :: (a -> W b) -> (W a -> W b) 
bind f (W x) = f x 

У меня есть базовые знания о Haskell (не использовал его в течение длительного времени), но эта подпись не казалась правильной.

Я установил GHC и проверил, что он думает, - оказалось, что думает, что я делаю, т.е .:

:t bind 
bind :: (t1 -> t) -> W t1 -> t 

Что мне не хватает?

+0

вы ввели определение без подписи типа. Если вы включите подпись, вы получите правильный тип: используя 'Maybe' для' W', я попробовал 'GHCi>: t let {bind :: (a -> Maybe b) -> (Возможно, a -> Возможно b) ; bind f (Just x) = f x} в bind' и вернулся ':: (a -> Maybe b) -> Может быть a -> Возможно, b'. Эта функция, 'bind', является связыванием Haskell' >> = ', flipped:' flip (>> =) :: (Monad m) => (a -> m b) -> m a -> m b'. –

ответ

6

Инспектор типа Haskell всегда считает наиболее общей подпись. Поскольку в вашей реализации bind вы ничего не делаете, выставляя аргумент f как нечто более конкретное, чем функция от любого типа до , любой другой тип (не конкретно W b), то есть имеющий подпись a -> b (или t1 -> t, as написанный inferer), конечно, так оно и остается.

Другими словами, подпись (a -> b) -> W a -> b является более общей версией (a -> W b) -> (W a -> W b).

+0

Хорошо. Пожалуйста, помогите мне в еще одном: авторский тип учебника - это «функция, которая принимает функцию« от a до W b »и возвращает функцию« от W a до W b' »*, правильно? И выводимый тип - это функция, которая принимает функцию AND a w t1 AND возвращает t ...? – Parobay

+0

@ Parobay замечает, что 't' in' (t1 -> t) -> W t1 -> t' можно заменить 'W t1', чтобы дать подпись, указанную в учебнике ... вот что подразумевается под этим являясь более общей подписью. –

+0

@Parobay Поскольку это более общая функция, она будет работать для 'W t1', а также для любого другого типа. –

Смежные вопросы