2016-09-29 4 views
1

次のコードはコンパイルされません。カスタムタイプのリストの上にFmap?

data Outcome a = Fail | Pass a deriving (Show, Eq, Ord, Functor) 

myList = [Pass 33, Pass 12, Fail, Pass 45] 

main = do 
    print $ fmap (+1) myList 

これが動作しない理由を私は成功した=空のデータツリーA」タイプの私のバイナリツリーに同様のアプローチを適用してきたように、私は、見ることができません|ノードa(ツリーa)(ツリーa) '?

答えて

6

リストはファンクタであり、[Outcome]がありますので、関数Outcome -> bを指定する必要があります。あなたが使用する必要があるので、リスト内の各Outcomeから(+1)を適用するように見えます:

fmap (\o -> fmap (+1) o) myList 

または

fmap (fmap (+1)) myList 
11

問題は、あなたがの各要素に1を追加しようとしているということですリストmyListは、タイプがOutcome Integerです。代わりにこれを試してみてください:

fmap (fmap (+1)) myList 

またはそれをより明確にする:

map (fmap (+1)) myList 

だから、外fmapがリストに適用され、内側のものがOutcomeファンクタに適用されます。したがって、リストの各要素には、関数fmap (+1)が適用され、(+1)という関数がOutcomeの値に適用されます。

+3

時々 '(fmap。fmap)(+1)myList'、' fmap2 = fmap。 fmap'も便利です。 – phadej

+3

時々、私はそれを '<$$>'と呼んでいます。 –

関連する問題