2014-08-31 60 views
2

我一直在閱讀如何在C#中實現monad。在更多類似Haskell的實現中,例如here中使用的類型使用稱爲Just的類型來包裝除「Nothing」之外的結果。這種類型只是一種便利嗎?我們不必在我們的代碼中隨處說出Maybe,或者它有其他一些我不理解的屬性? Eric Lippert的implementation不使用稱爲Just的類型,而是例如返回Tainted<R>也許monad什麼是正義?

+0

我相信'Tainted'的例子與'Maybe'例子不同。 – 2014-08-31 03:26:45

+0

我發現這種實現(使用接口和類有點missleading - 更多1:1實現是恕我直言,像這樣:https://github.com/CarstenKoenig/DWX2014/blob/master/Monads/Monaden%20Solution/ Monaden.CSharp/Maybe/Maybe.cs(如果你錯過了'return' - 它只是'Some' - 這是爲了演示如何實現LINQ語法特性並將其與F#/ Haskell進行比較,所以我可能會有一些不幸的混合名稱(一些vs只是)(也許vs選項)在那裏:( – Carsten 2014-08-31 08:49:41

回答

2

儘管在C#中聲明瞭Just作爲一個類,但它在技術上不是一種類型。在Haskell的說法中,Just被稱爲數據構造函數;它會創建類型爲Maybe的數據。同樣,Nothing也是一個數據構造函數。

在Haskell中,Maybe被用作簡單的錯誤處理機制。 Just表示包裝的值是操作的結果,而Nothing表示某種錯誤。作爲一個基本的例子,Haskell有具有以下簽名(1)的函數:

lookup :: [(key, value)] -> key -> Maybe value 

lookup函數接受的(鍵,值)對和密鑰列表並返回包裹在Maybe的值。如果密鑰存在,則關聯值將被包裝在Just中,否則返回Nothing

(1)我故意遺漏了與本次討論無關的細節。

Tainted來自Eric Lippert的文章看起來像是Monad的另一個例子,但與monad完全不同。我不認爲它比單子模式的相似性更有用。

+0

好的答案!我傾向於使用'也許'''選項'無論你將調用它時,函數是*部分*或當那裏只是失敗的一個原因 - 也就是說有一些輸入沒有任何有意義的輸出('lookup'就是一個很好的例子) - 當我想要更多的原因時會使用'Either String'有一個原因)(當然,如果在輸出類型中包含錯誤/底部,那麼您可以查看每個函數的總和是一點點哲學) – Carsten 2014-08-31 08:47:17

+0

這是有道理的。感謝您解決這個問題。 – Kevin 2014-08-31 18:02:06