1

通过利用高阶函数,实现该函数的最佳方法是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]
4

1 回答 1

3

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

一旦我们有了它,makeCloths 就是 zipWith 函数的一个特例。

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

它的类型签名最有意义

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