2017-07-31 111 views
1

我是Haskell的初學者。現在,我試圖定義一個數據如下:如何在haskell中實現自定義數據的Functor實例

data Unsure a = Sure a |Error [Char] 
deriving (Show) 

然後試圖執行函子是這樣的:

instance Functor Unsure where 
    fmap f (Sure x) = Sure (f x) 
    fmap f (Error e) = Error e 

在我看來,應該FMAP工作,一旦我實現了對函數對象不確定。所以,我可以使用FMAP做這樣的事情:

fmap (+3) (+100) Sure 1 

結果應該是當然104,其實我得到了一個錯誤

•在約束非類型變量參數: Num(不確定a) (使用FlexibleContexts來允許) •當檢查推斷的類型 時:: a。 (Num(Unsure a),Num a)=>不確定一個

任何建議嗎?

+2

爲什麼你認爲應該工作? –

+0

我犯了一個錯誤,現在當我輸入fmap(+3)當然是1,它顯示了Sure 4。 – dannybaobei

+0

其實我想要一個unbox的一般方法不確定,然後我可以做一些如fmap(==)100(當然100)。 – dannybaobei

回答

3

您可能會打算編寫fmap ((+3) . (+100)) (Sure 1)fmap (+3) $ fmap (+100) (Sure 1)

1

fmap是一個函數,其類型爲fmap :: Functor f => (a -> b) -> f a -> f b

在話,函數FMAP需要參數: 第一個參數是從類型ab的功能。 第二個參數是類型爲a的Functor的值。結果是b類型的Functor。

在你的例子中你寫:fmap (+3) (+100) Sure 1。在這個例子中FMAP具有參數: 第一個是(+3),第二是(+100),第三ID Sure和第四是1

至於寫@布賴恩奧利維爾使一個說法出來的(+3)(+100) 您可以用(。)運算符將它們組合起來,並把這個表達式轉換括號。然後這給你fmap的第一個參數。

然後,您必須將Sure 1放入括號 以獲取fmap的第二個參數。

所以你們一起寫fmap ((+3) . (+100)) (Sure 1)

0

除了說別人,如果添加使用DeriveFunctor語言擴展(例如,通過{-# LANGUAGE DeriveFunctor #-}編譯)你可以得到函子:

data Unsure a = Sure a |Error [Char] 
    deriving (Show, Functor)