私はHList実装を行っていますが、私はmap
関数を実装しようとしています。私はさまざまなアプローチを試してきましたが、それぞれについて、その関数に関連するコンパイラエラーが発生します。ジェネリック関数を使用した異種データ構造のマッピング
以下は、入力データ構造のすべての要素に汎用関数Just
を適用する方法の例です。
No instance for (Apply (a0 -> Maybe a0) Int (Maybe Int))
arising from a use of `hMap'
The type variable `a0' is ambiguous
これを解決するためにすべての方法でありますし、そうでない場合は、なぜ:これで
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
-- | An input heterogenous data structure
recursivePairs :: (Int, (Char, (Bool,())))
recursivePairs = (1, ('a', (True,())))
-- | This is how I want to use it
recursivePairs' :: (Maybe Int, (Maybe Char, (Maybe Bool,())))
recursivePairs' = hMap Just recursivePairs
class HMap f input output where
hMap :: f -> input -> output
-- | A counterpart of a Nil pattern match for a list
instance HMap f()() where
hMap _ _ =()
-- | A counterpart of a Cons pattern match for a list
instance
(HMap f iTail oTail,
Apply f iHead oHead) =>
HMap f (iHead, iTail) (oHead, oTail)
where
hMap f (head, tail) = (apply f head, hMap f tail)
class Apply f input output where
apply :: f -> input -> output
instance Apply (input -> output) input output where
apply = id
私は、次のコンパイラエラーを取得していますか?
私はこの問題は、型システムがhMap' 'のあなたの定義は同じ' F'を再利用し続けるので、あなたが連続する各アプリケーションの異なる具体的なタイプで 'Just'をインスタンス化していることを認識しないということだと思います。あなたが最初にそれを適用するとき、型は 'Int - > Maybe Int'です。それを2回目に適用すると、型は' Char - > Maybe Char'になります。しかし、私はそれを修正する方法はまだかなり分かりません。 –
@GabrielGonzalez はい、それはまさに問題です。そして、もしあなたが ''入力出力 - > f'を 'Apply'クラスに渡すと、エラーメッセージは'(Bool - > Maybe Bool)Char(Maybe Char) 'のようなインスタンスを探していると言います。私は['cast'](http://hackage.haskell。タイプレベルで 'f'の2つの使用法を切り離すために、しかし非常に自然な感じではない、 「Typeable」にもよるが、それほど魅力的ではなかった。 –