2016-12-15 12 views
1

私は関数a -> [b]を持っていますが、同様の関数に変換する関数を探していますが、リストの要素は新しい型/データでラップされています:a -> [t b]。だから私は次のことをする関数を見つける必要があります:(a -> [b]) -> (a -> [t b])新しいデータ型の関数の出力をラップする

Hoogleはtraverseに最も近い一致を示していますが、正確には私が探しているものではありません。 Haskellの強力なtypeclassesを使って、私が必要とする関数を構築する方法はありますか?

私は管理することはできませんが、コードはBoardable <$> makeBListFrom aのようにもっと冗長でなければなりません。のBoardableコンストラクタを表します。

+3

私はその目的のために具体的なものは何もないと思います。私の唯一の提案は、あなたが最後の段落で示唆している点の点数のスペルは間違いなく少し控え目であることです: 'fmap Boardable。 makeBListFrom' – duplode

+0

はい!まったく。それが私の言いたいことです。ありがとうございました。 – Dahan

答えて

1

なぜ、mapの各要素にコンストラクタがありますか?

Prelude> data X a = C a deriving Show 
Prelude> map C [1, 2, 3] 
[C 1,C 2,C 3] 
Prelude> :t map C [1, 2, 3] 
map C [1, 2, 3] :: Num a => [X a] 
+1

OPはすでに '(<$>)'(質問の最後の段落を参照)を通じてこれを行っています。 – duplode

+0

'Boardable <$>'のような振る舞いをする演算子を探していると仮定しました。たぶん私はあまりにも多くの質問に読んでいた。 –

+0

はい。 'map'や' fmap'や '<$>'は明らかに可能です。しかし、それは私が_verbose_と呼ぶものです。今、私はそれを持っています。 私が探しているのは、スマートな方法です**実際のリストを 'map'に与えるのではなく、そのまま関数を変換することです。 – Dahan

3

あなたがnewtypeを使用している場合は、(ランタイムの観点から、a -> [t b]への変換a -> [b]は何もしませんので)coerceを探しています。もちろん、これはHaskellがあなたが強要しようとしている型を推測できる場合にのみ有効です。

coerce makeBListFrom :: A -> [Boardable B]ABは、makeBListFrom :: A -> [B]から決定されるタイプです)。


dataのためのこの意志ない作品。また、私の場合は、fmap Boardable . makeBListFromに固執します。あなたの意図は、コンパイラと読者の両方に明確になります(いずれかをチェックする必要はなく、どちらもタイプを合成できます)。

+0

はい。入力いただきありがとうございます。 私は 'data'であり、さらに' ExistentialQuantification'ラッパーです。あ、はい。 'fmap'がキーです。 – Dahan

関連する問題