簡體   English   中英

Haskell MonadWriter類型簽名

[英]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) }

(對於Writerm是身份)。

但是,在Writer的類型簽名中,參數的順序很重要。 例如,如果我們查看帶有成員的Functor類型類

fmap :: (a -> b) -> f a -> f b

它使得可以用f替換Writer String (或者通常是Writer result )並獲得

fmap :: (a -> b) -> Writer result a -> Writer result b

這正是參數的正確順序。 交換它們會使Functor不可能實現(沒有一些技巧)。

對於所有帶有多個參數的類型/函數都是如此:它們可以用作單參數類型/函數的唯一方法是改變最后一個參數,而不是其他參數。

查看討論類似問題的相關問題:

切換Haskell中實例聲明的參數順序

在Haskell中出現故障

暫無
暫無

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

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