2016-03-05 3 views
2

Я видел, что тип pure 1 составляет (Num a, Applicative f) => f a, что совершенно очевидно. Так что, если я хотел бы сделать его Maybe Int:Haskell - Аппликативные/Monad экземпляры

Prelude> pure 1 :: Maybe Int 
Just 1 

Что об этом?

Prelude> pure 1 
1 
Prelude> return 1 
1 

Что происходит? Почему он не жалуется, что не знает, какой экземпляр выбрать?

Редактировать

Я думаю, что такое поведение на самом деле не имеет ничего общего с монадами или аппликативными, но это был контекст, я пришел к нему ...

+1

см. 'Return True' в [Действия ввода/вывода в командной строке] (https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/interactive-evaluation.html) –

ответ

3

Это особенность GHCI. Он имеет специальную обработку для действий IO, которые не только “ вычислено ” и напечатаны (вы все равно не можете печатать действие IO), но выполнено и результат& dagger; печатных. Так,

Prelude> pure 1 :: IO Integer 
1 

Согласно комментарий behzad.nouri в, here's the relevant manual section.


& dagger;IO a с Show a, а не a~(), в противном случае только действие выполнено.

+0

Итак, на самом деле это имеет какое-то отношение к Monad/Applicative экземплярам, ​​потому что IO является Monad/Applicative/Functor ... Я прав? – FtheBuilder

+1

Хорошо, если бы IO не были аппликативными, это явно не сработало. Я не уверен, как GHCi решает интерпретировать выражение как «IO»; по-видимому, он сначала пытается унифицировать любой тип с помощью «IO a», и только если этот сбой выходит из маршрута только для печати. Это не имело бы никакого отношения к монадам. – leftaroundabout

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