通过使用更高阶函数,实现函数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]
答案 0 :(得分:3)
首先,正如许多其他人所建议的那样,haskell不允许你拥有一系列基数不匹配的函数。您可能希望makeRedBlueDress属于Material类型 - >穿衣。如果你真的想要这种多态性,那么没有什么能阻止我们为带有多个参数(或由多个材料组成)的Material定义其他类型
有了这个,makeCloths就是zipWith函数的一个特例。
makeCloths = zipWith $ \x y -> (x y)
它的类型签名最有意义
zipWith $ \x y -> (x y) :: [b -> c] -> [b] -> [c]