は、以下のコードを検討:haskellの多型関数のリスト?
t1 :: [Int] -> (Int,String)
t1 xs = (sum xs,show $ length xs)
t2 :: [Int] -> (Int,String)
t2 xs = (length xs, (\x -> '?') <$> xs)
t3 :: [Int] -> (Char,String)
t3 (x:xs) = ('Y',"1+" ++ (show $ length xs))
t3 [] = ('N',"empty")
をこれら三つの機能は、部分的にのみ変化するタイプを持っている - 彼らが生産する組の第一の成分の種類を知らなくても、完全に使用可能です。機能の3つのすべてがfnListToStrs
の引数として独立して動作し、
fnListToStrs vs fs = (\x -> snd $ x vs) <$> fs
GHCiの中にこれらの定義をロードし、実際に私はリストを渡すことができます。これは私がそのタイプを参照することなく、それらを操作できることを意味します
*Imprec> fnListToStrs [1,2] [t1,t2]
["2","??"]
*Imprec> fnListToStrs [1,2] [t3]
["1+1"]
:タイプの発散が行われる演算に実際に無関係であっても、私は同時にすべての3を通過することができない
*Imprec> fnListToStrs [1,2] [t1,t2]
["2","??"]
*Imprec> fnListToStrs [1,2] [t3]
["1+1"]
:しかし、彼らは同じ型を持っているので、T1とT2の両方を含みます
私はこの作品を作ることは実存またはimpredicativeのいずれかのタイプとは何かを持っているが、私はつまり、fnListToStrsを取ることができることを期待型宣言を使用するときにどちらの拡張子が私のために働いていることを感じてい:
fnListToStrs :: [Int] -> [forall a.[Int]->(a,String)] -> [String]
を
これを行うには別の方法がありますか?
それは私が物事を少し単純化しまし可能です:あなたはおそらく、とにかく最初の結果では何もできないので、それだけで、すぐにそれを捨てると、単純な単形のリストに残っている機能を入れて、より賢明です私の質問は、実際にこれをどのように適用するかわかりません。実際のシナリオでは、関数はすでに型でラップされていますが、両方の型がパラメータとして型に公開されています。私は事実上、パラメータの1つを無視してリストを作成する必要があります。単純化されたAPIを作成しようとしているので、クライアントは明示的なラッパーを使用する必要はありません。しかし、それは可能ではないかもしれないようです... – Jules