2016-09-13 23 views
6
Just (+) <*> Just 3 <*> Just 5 

tylko 8różnicy pomiędzy 'Tak' i 'czysty'

pure (+) <*> Just 3 <*> Just 5 

tylko 8

pure (*3) <*> [0..10] 

[0,3,6, 9,12,15,18,21,24,27,30]

Just (*3) <*> [0..10] 

Nie można dopasować typ '[]' z 'być może'

Oczekiwany typ: Może b

rzeczywistego typu: [b]

w drugim argument "(< *>)", a mianowicie "[0 .. 10]"

W wyrażeniu : Podobnie (* 3) < *> [0 .. 10]

W równaniu tym '': to tylko = (* 3) < *> [0 .. 10]

Kiedy są pure i Just wymienne i kiedy są różne?

Odpowiedz

10

pure to operacja przeciążenia. Jest on zdefiniowany dla wszystkich typów, które implementują klasę Applicative. Jednym z typów, które to robią jest Maybe. Tak więc pure w tym kontekście jest taki sam jak Just. Istnieją jednak inne typy, które implementują również Applicative, takie jak [] (listy). W tym przypadku, pure oznacza singleton (tj. Funkcję, która przyjmuje pojedynczą wartość i zwraca listę jednoelementową, która zawiera tę wartość). Więc

pure (*3) <*> [0..10] 

naprawdę oznacza:

[(*3)] <*> [0..10] 

a nie

Just (*3) <*> [0..10] 

W tym ostatnim przykładzie staramy się mieszać list z maybes dlatego GHC go odrzuci. Ogólnie, haskell określa, jakie jest dokładne znaczenie pure w oparciu o kontekst, np. jeśli spróbujesz użyć go z maybes, zinterpretuje to jako Just, jeśli użyjesz go z listami, zinterpretuj go jako singleton.

6

Funkcja pure zwraca wartość polimorficzna:

Prelude> :t pure "foo" 
pure "foo" :: Applicative f => f [Char] 

Dla Maybe, pure właśnie zdefiniowano jako Just:

instance Applicative Maybe where 
    pure = Just 
    -- ... 

Inne typy zapewniają różne definicje; Jako przykład, jest zdefiniowany dla wykazach

instance Applicative [] where 
    pure x = [x] 
    -- ... 

Określanie typu dla wartości powrotnej mówi Haskell które Applicative przykład użyta dla określenia pure.

Oprócz wyraźnego typu, Haskell może określić, jakiego typu użyć w oparciu o sposób użycia wartości. Na przykład: (<*> [1..5]) :: (Num a, Enum a) => [a -> b] -> [b], czyli pure (+3) <*> [1..5], wiemy, że pure (+3) musi mieć typ [a -> b]. Podobnie w pure (+3) <*> Just 5 wiemy, że pure (+3) musi mieć typ Maybe (a->b).

Ogólnie rzecz biorąc, w każdym wyrażeniu pure f <*> g, typ g określa, jaki typ wartości pure f musi zwrócić.

Powiązane problemy