Haskell - 我应该如何避免头部或尾部,并采用模式匹配?

时间:2018-04-25 16:06:20

标签: haskell

我是Haskell的初学者,我被告知我应该避免使用head和tail进行列表操作,而是使用模式匹配。我在这里得到了一个代码片段,我想知道如何转换它以便不使用头部或尾部?

myzipWith :: (a->b->c) -> [a] -> [b] ->[c]
myzipWith func [] [] = []
myzipWith func listA listB =
    [func (head listA) (head listB) ] ++ (myzipWith func (tail listA) (tail listB))

2 个答案:

答案 0 :(得分:7)

myzipWith :: (a->b->c) -> [a] -> [b] ->[c]
myzipWith func [] [] = []
myzipWith func (headA:restA) (headB:restB) =
    [func headA headB] ++ myzipWith func restA restB

但请注意,追加(++)不是必需的。这将是更惯用(和有效):

    func headA headB : myzipWith func restA restB

答案 1 :(得分:4)

myzipWith func (a:as) (b:bs) = [func a b] ++ (myzipWith func as bs)

语法function (x:xs)将传递给function的列表拆分为两部分:第一个元素x和列表的其余部分xs