1

高階関数を利用することにより、関数を実装する最良の方法は何makeClothsですか? 私が達成したいと思っているのは、 で提供される正しい引数を のmakeCloths各メソッドに自動的に入力できることです。そのため、将来さらにメソッドが に追加され、そのメソッドが の引数のみを使用する場合、 のコードを変更する必要はありません。methodsListmaterialListmethodsListmaterialListmakeCloths

data Material = WhiteCloth Int
              | BlueCloth Int
              | RedCloth Int

makeWhiteShirt :: Material -> Clothe
makeWhiteShirt (WhiteCloth x) = .....

makeBluePants :: Material -> Clothe
makeBluePants (BlueCloth x) = .....

makeRedBlueDress :: Material -> Material -> Clothe
makeRedBlueDress (RedCloth x) (BlueCloth y) = ......

methodsList = [ makeWhiteShirt, makeBluePants, makeRedBlueDress ]
materialList = [ WhiteCloth 3, BlueCloth 2, RedCloth 2]

-- call makeCloths like so
-- listOfClothes = makeCloths methodsList materialList 
makeCloths :: [a] -> [b] -> [Clothe]
4

1 に答える 1

3

まず、他の多くの人が示唆しているように、haskell では、カーディナリティが一致しない関数の配列を使用できません。makeRedBlueDress をマテリアル -> 服のタイプにしたいと思うでしょう。この種のポリモーフィズムが本当に必要な場合は、複数の引数を取る (または複数のマテリアルで構成される) マテリアルの追加の型を定義することを止めるものは何もありません。

それができたら、makeCloths は zipWith 関数の特別なケースです。

makeCloths = zipWith $ \x y -> (x y)

そのための型シグネチャが最も理にかなっています

zipWith $ \x y -> (x y) :: [b -> c] -> [b] -> [c]
于 2013-02-18T11:52:11.670 に答える