嘗試為我的一種資料型別實作 fmap 時遇到一個非常奇怪的錯誤:我的資料型別定義如下:
newtype WarningAccumulator w a = WarningAccumulator (a,[w])
deriving (Show,Eq)
接下來我實作了fmap函式如下:
instance Functor (WarningAccumulator w) where
fmap :: (a -> b) -> WarningAccumulator w a -> WarningAccumulator w b
fmap f (WarningAccumulator (list, value)) = WarningAccumulator(list, f value)
它給了我:
Couldn't match type ‘a’ with ‘b’
Expected: WarningAccumulator w b
Actual: WarningAccumulator w a
這讓我很困惑,因為 f 值會回傳型別 b 而不是 a,所以我不知道為什么會出現這個錯誤?有人可以向我解釋為什么以及如何解決它嗎?
uj5u.com熱心網友回復:
您會感到困惑,因為您的型別引數是按順序排列的w a,而您的建構式的欄位是按順序排列的a [w]。如果您想要 fmap ,您確實需要將a型別引數放在最后,但建構式的欄位可以按任何順序排列。如果在語意上不太錯誤,您可能會選擇重新排序欄位,以便您可以記住它們如何匹配型別引數。如果你這樣做,你的實作fmap將突然正確。
或者,您可以保持欄位順序不變,list并value在您的fmap實作中交換 和 的出現:
instance Functor (WarningAccumulator w) where
fmap f (WarningAccumulator (value, list)) = WarningAccumulator(f value, list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517112.html
標籤:哈斯克尔
上一篇:Haskell中的應用實作
