3

関数とリストのペアのリストを取得し、各ペアの関数をペアのリストにマップする関数があるとします。次に例を示します。

myFunction [("SOME"++,["DAY","ONE"]), (show,[1,2])] == [["SOMEDAY", "SOMEONE"],["1","2"]]

上記で提供したコードが変更なしでそのまま機能するようにmyFunctionを実装する方法はありますか?

私の問題は、各サブリストのタイプが異なる可能性があるため、myFunctionの実装方法がわからないことです(私の例では、文字列のリスト["DAY"、ONE "]と数値のリストがあります:[ 1,2])。リスト内の各関数がそのリストを文字列のリストに変換することは知っていますが(したがって、最終的なリストのタイプは[[Char]]になります)、Haskellでこれを表現する方法がわかりません。 。

4

2 に答える 2

4

存在型でそれを行うことができます

{-# LANGUAGE ExistentialQuantification #-}

data T = forall a b. Show b => (:?:) (a -> b) [a]

table =
    [ ("SOME"++) :?: ["DAY","ONE"]
    , (show)     :?: [1,2]
    , (+1)       :?: [2.9, pi]
    ]

そして、次のように実行します。

apply :: T -> String
apply (f :?: xs) = show $ map f xs

main = print $ map apply table
于 2012-05-11T12:54:17.917 に答える
1

存在量化を使用して、型クラスのメンバーである限り、任意の値を保持できる型を定義しますShow。例えば:

{-# LANGUAGE ExistentialQuantification #-}

data S = forall a. Show a => S a

instance Show S where
    show (S s) = show s

f :: [S] -> [String]
f xs = map show xs

そして今ghciで:

*Main> f [S 1, S True, S 'c']
["1","True","'c'"]

Haskell 型システムで禁止されている異種のリストが含まれているため、変更せずに質問のコードを実行することはできません。代わりに、異種の型をバリアント型 (必要なすべての型が事前にわかっている場合) または存在量化された型 (必要な型がわからないが、プロパティはわかっている場合) としてラップできます。満たす必要があります)。

于 2012-05-11T12:57:29.897 に答える