[英]Haskell MonadWriter type signature
關於MonadWriter的Noob問題:
monadWrite :: Writer String Int
monadWrite = writer (3003, "log 1\n")
為什么String
在typesig和Int
second中排在第一位,而3003
顯然是Int
而"log 1\\n"
是String
。 瑣事,我知道,但我想明白。
沒有特別的理由將結果( 3003
)放在第一位,將輸出( "log 1\\n"
)放在參數的第二位給writer
。 我想,訂單選擇與WriterT
的內部表示相對WriterT
:
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }
(對於Writer
, m
是身份)。
但是,在Writer
的類型簽名中,參數的順序很重要。 例如,如果我們查看帶有成員的Functor
類型類
fmap :: (a -> b) -> f a -> f b
它使得可以用f
替換Writer String
(或者通常是Writer result
)並獲得
fmap :: (a -> b) -> Writer result a -> Writer result b
這正是參數的正確順序。 交換它們會使Functor
不可能實現(沒有一些技巧)。
對於所有帶有多個參數的類型/函數都是如此:它們可以用作單參數類型/函數的唯一方法是改變最后一個參數,而不是其他參數。
查看討論類似問題的相關問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.