如何有效地使用高阶函数?

时间:2013-02-18 11:24:28

标签: haskell

通过使用更高阶函数,实现函数makeCloths的最佳方法是什么? 我希望实现的是makeCloths可以使用methodsList中提供的正确参数自动填充materialList中的每个方法。因此,如果将来有更多方法添加到methodsList,并且方法仅使用materialList中的参数,那么我们不需要修改makeCloths中的代码。

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]

1 个答案:

答案 0 :(得分:3)

首先,正如许多其他人所建议的那样,haskell不允许你拥有一系列基数不匹配的函数。您可能希望makeRedBlueDress属于Material类型 - >穿衣。如果你真的想要这种多态性,那么没有什么能阻止我们为带有多个参数(或由多个材料组成)的Material定义其他类型

有了这个,makeCloths就是zipWith函数的一个特例。

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

它的类型签名最有意义

zipWith $ \x y -> (x y) :: [b -> c] -> [b] -> [c]