查看一些Writermonad 示例,在Learn You a Haskell的示例中,我看不到*最后一行運算式中乘法運算子的使用在哪里被多載以與函式Writer產生的物件一起使用logNumber:
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber x = Writer (x, ["Got number: " show x])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a*b)
uj5u.com熱心網友回復:
這里似乎有些誤會。在您的示例代碼中:
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber x = Writer (x, ["Got number: " show x])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a*b)
值a和b不是值 Writer。它們的型別是 simple Int,當然你可以乘以 2 Ints。因此,在最后一行中使用on ita*b也是非常重要的,這正是為了將 type 的“普通值”“提升”為 type的“monadic value”而需要的。Intreturna*bIntWriter [String] Int
logNumber 3肯定是一個單子值(型別Writer [String] Int),但符號的<-語法糖do“提取”了它的基礎值,并給它一個名字 - 這里a。更準確地說,do上面的塊去糖:
multWithLog = logNumber 3 >>= \a -> logNumber 5 >>= \b -> return (a*b)
其中 lambda 運算式具有型別Int -> Writer [String] Int(引數a和b有問題的Ints),由于型別的原因,這會產生一個整體型別>>=的運算式。Writer [String] Int
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517174.html
標籤:哈斯克尔单子
