![](/img/trans.png)
[英]Haskell: Why “Nothing<(4::Maybe Int)” gets an error but “Nothing< Just 4” pass?
[英]Why Nothing >> Just 3 is Nothing in Haskell?
Haskell中>>
函數的簽名是這樣的:
(>>) :: m a -> m b -> m b
默認的實現是:
x >> y = x >>= \_ -> y
這樣,我知道>>
函數始終返回其右參數,而與左參數的值無關。 Lambda甚至都不在乎左參數(x)的值。 那么,為什么Nothing >> Just 3
等於Nothing
呢? 它不應該只返回Just 3
,因為那是右邊參數的值?
我知道,任何Just
值與Nothing
關聯時都將返回Nothing
,但是在這種情況下,lambda甚至不會捕獲Nothing
。 我想念什么?
獎勵問題>>=
稱為綁定。 >>
叫什么?
謝謝。
因為綁定甚至都不在乎lambda的值!
Just x >>= f = f x
Nothing >>= _ = Nothing
注意(Nothing >>=)
不求值第二個參數。
要真正了解在這種情況下(>>)
作用,您必須查看Maybe
的(>>=)
的定義 :
(Just x) >>= k = k x
Nothing >>= _ = Nothing
Nothing >>= k
計算結果為Nothing
不管什么k
功能。 在(>>)
的特定情況下, k
恰好是\\_ -> y
。
這樣,我知道>>函數總是返回其右參數,而不管左一個參數的值如何
這就是您困惑的根源!
m >>= f
調用f
為其“查找”在m
內的值,“組合”結果(其中值在“ monadic值內”的含義以及“ combine”的含義是monad特定的) 。
m >> n
必須等於m >>= \\_ -> n
。 因此,對於在m
內找到的每個值,它將在其上調用\\_ -> n
。 但Nothing
在Maybe
單子沒有“內部” 的任何值。 所以\\_ -> n
甚至都不能在任何東西上被調用以忽略它並返回n
! 所以Nothing >>= \\_ -> n
不需要返回不依賴於n
任何東西,因為它無法調用該函數來獲取n
。 在此上下文中也沒有浮動類型的任何值,因此唯一可用的選項就是Nothing
。
因此,與其理解您的直覺>>
是忽略左側並返回右側的內容,不如認為它采用左側內容的“單子結構”並將其與右側的單子值綁定。 “單子結構”是“所有定義單子值而不是其內部值的東西”的慣用語。
listA >> listB
中的特定值如何, listA >> listB
執行相同的listA
,但是重要的是其中有多少個元素。 ioA >> ioB
做同樣的事情,無論是通過執行產生什么價值的ioA
,但重要的副作用做生產。 stateA >> stateB
忽略由stateA
產生的值,但將當前狀態發送到stateB
。 maybeA >> maybeB
執行相同的操作,而不管maybeA >> maybeB
中的特定值maybeA
,但是是否有值很重要。 注意列表的行為與Maybe
非常相似; 如果listA
為空,則listA >> listB
也必須為空。
至於您的獎金問題,當我在腦海中對自己閱讀代碼時,我傾向於將>>=
和>>
都發音為“ bind”; 當我在查看代碼並發音時,對上下文有足夠的非語言意識,這種歧義無關緊要。 我實際上不知道該如何與某人大聲談論>>=
和>>
; 也許是“綁定”和“健忘的綁定”?
我認為有兩種方法可以解釋這一選擇。
您呼吁Maybe與IO不同,它沒有副作用。 否則,不對第二個參數求值就沒有意義。 從這種觀點來看,從邏輯的角度看,這似乎是一個任意選擇,盡管如果可能的話,它肯定會更有效。
您使Nothing代表錯誤。 然后,第一個參數中的錯誤將消除對第二個參數進行求值的需要。 看來這是作者選擇的理由:
http://hackage.haskell.org/package/base-4.7.0.0/docs/src/Data-Maybe.html#Maybe
-- The 'Maybe' type is also a monad. It is a simple kind of error
-- monad, where all errors are represented by 'Nothing'.
我想補充一些其他答案。
Nothing >>= f
必須為Nothing
的原因是因為無法檢查f
是否實際使用了它的參數(至少沒有可怕的不安全技巧)。
x >> y = x >>= \\_ -> y
不僅是默認實現。 >>
的定義應始終與此結果相同。 只允許重載它,因為有時可以更有效地實現它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.