2017-07-31 9 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 

私はわからないためのFunctorを実装したら、FMAPは動作するはずです。だから私のような何かをするFMAPを使用することができます。

fmap (+3) (+100) Sure 1 

結果は私が制約で非型の変数引数•エラー

を持って実際には、確かに104になるはずでした。 Num(Unsure a) (これを可能にするためにFlexibleContextsを使用) •推測されたタイプ をチェックするとき、それは:: forallです。 (Num(Unsure a)、Num a)=>わからないa

何か提案がありますか?

+2

は、あなたはそれが動作するはずだと思うのはなぜ? –

+0

私はfmap(+3)と入力したときに間違いました。 – 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の関数です。 最初の引数は、型aからbの関数である:すなわち

、機能FMAPは引数を取ります。 第2引数は、タイプaのFunctorの値です。結果はタイプbのFunctorになります。

例では、次のように書いています。fmap (+3) (+100) Sure 1。この例でFMAP4つの引数有する: まず(+3)であるが、第二第三のID Sureと第四の1で、(+100)あります。 (+3)のうちの一つの引数を作るために@Brianオリヴィエによって書かれたよう

(+100) あなたは(。)演算子とそれらを組み合わせて、括弧の中にこの式を置くことができます。これにより、fmapの最初の引数が得られます。

次に、Sure 1を括弧 に入れて、fmapの2番目の引数を取得する必要があります。

だから一緒にあなたはfmap ((+3) . (+100)) (Sure 1)を書く必要があります。他の人が言ったことに加えて

0

、あなたは({-# LANGUAGE DeriveFunctor #-}プラグマ経由など)DeriveFunctor言語拡張を使用して追加する場合はファンクタを単に導き出すことができます。

data Unsure a = Sure a |Error [Char] 
    deriving (Show, Functor) 
関連する問題