簡體   English   中英

為什么什么>> Haskell中只有3什么都沒有?

[英]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 NothingMaybe單子沒有“內部” 的任何值。 所以\\_ -> 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”; 當我在查看代碼並發音時,對上下文有足夠的非語言意識,這種歧義無關緊要。 我實際上不知道該如何與某人大聲談論>>=>> ; 也許是“綁定”和“健忘的綁定”?

我認為有兩種方法可以解釋這一選擇。

  1. 您呼吁Maybe與IO不同,它沒有副作用。 否則,不對第二個參數求值就沒有意義。 從這種觀點來看,從邏輯的角度看,這似乎是一個任意選擇,盡管如果可能的話,它肯定會更有效。

  2. 您使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'.

我想補充一些其他答案。

  1. Nothing >>= f必須為Nothing的原因是因為無法檢查f是否實際使用了它的參數(至少沒有可怕的不安全技巧)。

  2. x >> y = x >>= \\_ -> y不僅是默認實現。 >>的定義應始終與此結果相同。 只允許重載它,因為有時可以更有效地實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM