4

私はそれがファンクターであるfmapタイプを持っていることを知っています(そしてファンクターが何であるかに応じて異なることをします)。私の基本的な質問は次のとおりです。いくつかの呼び出しが与えられた場合、 ghc はファンクターが何であるかをどのように理解するのですか?(a -> b) -> f a -> f bffmap r xfxr

これをもっと正確にしましょう。と は、ある型に対して=であるが、とは異なるようなファンクターであるfとします。has typeとhas typeの場合、 some of typeと something of typeの2 つの異なる結果が考えられるようです。このあいまいさはどのように解決されますか?f'f af' aaf bf' bra -> bxf afmap r xf bf' b

二次的な質問: 奇妙なファンクターを作成してこれをテストしたかったのですが、おそらく任意の型を取りa、関数に対して愚かなことをするものです...しかし、私ができる正しい構文を見つけていないようですこの方法でファンクタを指定します。(そのようなものはありますか?ファンクターのインスタンスにする前に、型クラス名を作成する必要があるようです。)[Int]adata Newtype a = [Int]

編集:私は今それを手に入れましたが、記録のために、本当の問題(これは私の質問でのみ暗黙的です)は、すでに存在するFooようFoo aなタイプのファンクターを持つことができないことに気付いていなかったことです。Int

4

4 に答える 4

2

あなたが探している一般的な答えは、Haskell 型は型の型のような「種類」を使用して編成されているということだと思います。

Functorクラスはこちら

class Functor f where
    fmap :: (a -> b) -> f a -> f b

明示的ではありませんが、これはそれfが kind を持つ型コンストラクタであることを意味し* -> *ます。その種類の型のみをFunctors にすることができます。

これは実際にはかなり強い声明です。これは、型引数では anyFunctorがパラメトリックでなければならないことを意味します。今あなたの声明を考えてみましょう:

f と f' が、あるタイプ a に対して fa = f' a であるが、fb と f' b が異なるような関手であるとします。

親切なシステムを考えると、これは不可能です。aFunctorはその型引数でパラメトリックであるため、 は をf a = f' a意味f = f'し、したがってを意味しますf b = f' b

「奇妙なファンクター」で何を求めているのか完全にはわかりませんが、Functor型クラスでは表現できないもののように聞こえます。IIRCは Hask でエンドファンクターFunctorのみを表現できます。カテゴリ間のファンクタを可能にする別の抽象化が必要になる場合があります。

于 2013-08-13T17:29:29.903 に答える
0

渡す引数によって異なります。たとえば、リストはファンクターであり、そうですMaybe

main = do
   putStrLn $ show (double [1..5])
   putStrLn $ show (double (Just 3))
   putStrLn $ show (double Nothing)

double :: (Functor f, Num a) => f a -> f a
double = fmap (*2)

*Main> main
[2,4,6,8,10]
Just 6
Nothing

このdouble関数は、 を保持している任意のファンクターに対して機能しますNum

于 2013-08-13T17:02:31.030 に答える
0

「 と は、あるタイプの=のようなファンクタであると仮定fしますが、とは異なります。」f'f af' aaf bf' b

これは本当に意味がありません。ff'が同じか、そうでないかのどちらかです。引数の型によって異なる中間状態を示唆しているようです。そんなことはあり得ません。

rが typea -> bxhas typef aの場合、 には 2 つの異なる結果が考えられるようですfmap r x: some of typef bと something of type f' b. このあいまいさはどのように解決されますか?」

どこf'から来たの?上記の署名には何も言及されていません。xhas typeであるためf a、 の結果は- この場合は sinceでfmap始まる何らかの型を持つ必要があります。これは完全に明白です。の結果は常に、開始時と同じファンクターにあります。ff br :: a -> bfmap

于 2013-08-13T17:19:41.837 に答える