-1
A
回答
6
Maybe a
是定義爲一個普通的數據類型:
data Maybe a = Just a | Nothing
因而有兩種可能性:或者你定義a
類型的值爲Just a
(如Just 3
)或Nothing
,以防查詢沒有答案。
這意味着定義爲定義非全部函數輸出的方法。
例如:假設您想定義sqrt
。平方根僅對於正整數定義,從而可以定義sqrt
爲:
sqrt x | x >= 0 = Just $ ...
| otherwise = Nothing
與...
的方式來計算平方根x
。
有些人將Nothing
與在大多數編程語言中找到的「空指針」進行比較。默認情況下,你沒有爲你定義的數據類型實現一個空指針(如果你這樣做,所有這些「空」看起來不同),通過添加Nothing
你有一個通用的空指針。
因此可以使用Maybe
來表示可能沒有計算輸出。你當然也錯誤的值小於0
:
sqrt x | x >= 0 = Just $ ...
| otherwise = error "The value must be larger or equal to 0"
但誤差一般不會在類型簽名提到的,也沒有一個編譯器有任何問題,如果你不考慮它們。 Haskell也轉向總計功能:最好儘量至少爲所有可能的輸入返回一個值(例如Nothing
)。
如果你以後想使用Maybe a
的結果,你比如需要寫:
succMaybe :: Maybe Int -> Maybe Int
succMaybe (Just x) = Just (x+1)
succMaybe _ = Nothing
但是,對於第一種情況寫Just
,你莫名其妙地提醒自己,這是可能的Nothing
可以發生。
justOrDefault :: a -> Maybe a -> a
justOrDefault _ (Just x) = x
justOrDefault d _ = d
的內置maybe
功能(注意是小寫),結合了前兩者的功能:
maybe :: b -> (a -> b) -> Maybe a -> b
maybe _ f (Just x) = f x
maybe z _ Nothing = z
所以你指定你也可以通過引入一個「默認」值去掉Maybe
的b
(默認值)和一個函數(a -> b
)。在Maybe a
爲Just x
的情況下,將該功能應用於其並返回,如果輸入值爲Nothing
,則將使用默認值。
與Maybe a
一起工作可能很難,因爲您總是需要考慮Nothing
的情況,爲了簡化這一點,您可以使用Maybe monad。
湯姆Schrijvers也表明Maybe
是類型代數後繼功能:你一個額外的價值添加到您的類型(Either
是加法和(,)
是類型代數相當於乘法)。
相關問題
- 1. void是什麼類型,它是如何工作的?
- 2. Jenkins的種子工作是什麼?它是如何工作的?
- 3. 什麼是IOR文件,它是做什麼的,它是如何工作的?
- 4. 什麼是延遲後臺工作?它是如何工作的?
- 5. PreparedStatement緩存 - 它是什麼意思(它是如何工作的)
- 6. Ext.net PageProxy:它是什麼,它是如何工作的?
- 7. 什麼是數據類型,它是如何實現的?
- 8. promisifyAll如何工作,或者它的工作要求是什麼?
- 9. 什麼是複製的指針,它們是如何工作的?
- 10. 什麼是懶惰的策略,它是如何工作的?
- 11. 什麼是Wicket中的ResourceReferences,它們是如何工作的?
- 12. Android中的android:weightSum是什麼,它是如何工作的?
- 13. 什麼是SQL中的binary_checksum?它是如何工作的?
- 14. 什麼preprocessing.scale()做什麼?它是如何工作的?
- 15. 什麼是intptr_t,它是整型還是指針的類型?
- 16. 什麼是print << EOF;它是如何工作的?
- 17. 什麼是autoresizesForKeyboard,它是如何工作的?
- 18. 什麼是Microsoft消息隊列(MSMQ)?它是如何工作的?
- 19. 什麼是[cmdletbinding()],它是如何工作的?
- 20. 這個網址是什麼意思,它是如何工作的?
- 21. 這是什麼語法結構,它是如何工作的?
- 22. 什麼是參考計數器,它是如何工作的?
- 23. 什麼是Equals Operator?它是如何工作的?
- 24. 什麼是SSH,它是如何工作的?
- 25. 什麼是cron文件?它是如何工作的?
- 26. 什麼是Windows套件,它們是如何工作的?
- 27. 什麼是多線程程序,它是如何工作的?
- 28. 什麼是視圖...視圖?它是如何工作的?
- 29. QML - 什麼是id,它是如何工作的?
- 30. 什麼是「do_shortcode」在WordPress和它是如何工作的?
你無法理解的是什麼?你面臨什麼錯誤?我建議你在發佈問題前先嚐試一下。 – Sibi 2015-04-05 11:35:48
它實際上是一個有效的定義嗎? (注:我提到一個修訂,以同一行上的'function calculate'開頭) – zerkms 2015-04-05 11:38:29
http://en.wikibooks.org/wiki/Haskell/Libraries/Maybe – zerkms 2015-04-05 11:40:18