模式匹配以迭代列表

raa*_*m86 0 logic haskell list

我正在尝试从Haskell Road到Logic学习Haskell 并遇到了这个例子:

    mnmInt :: [Int] -> Int
    mnmInt [] = error "empty list"·
    mnmInt [x] = x
    mnmInt (x:xs) = min x (mnmInt xs)
Run Code Online (Sandbox Code Playgroud)

我理解这些函数需要一个列表Int- 如果不是则检查是否为空检查它是否是带有1 int的列表,如果是,则返回x,如果没有将xs参数的mnmInt插入min.

它是如何达到基础案例的?xs代表什么?

最小实施:

   min' :: Int -> Int -> Int
   min' x y | x <= y    = x
            | otherwise = y
Run Code Online (Sandbox Code Playgroud)

没有数组.

Wes*_*Wes 5

(x:xs)是模式匹配语法.模式匹配允许您"解构"数据类型并将它们绑定到名称.在这种情况下,x是列表的头部,xs是尾部.min'不需要列表,因为x是列表的头部,而不是列表本身.

min'它本身可以找到两者之间的最小值Ints,mnmInt最终会扩展为类似于(min' 1 (min' 2 (min' 3 4)))传入一个看起来像的列表[1,2,3,4].

如果您手动评估代码,这很容易看出,我强烈建议您尝试.请记住,(x:xs)有两个名称,即列表的头部和尾部.您可能想要使用构建列表:

这是一个示例,显示模式匹配如何与代码流相关.

foo (x:y:[]) = "two"
foo ([]) = "none"
foo (_) = "some other value"
Run Code Online (Sandbox Code Playgroud)

如果你打电话foo [1,2]它会输出"两个",如果你这样做foo [1,2,3]会给你"一些其他价值",如果你这样做foo []会返回"none"

  • @ raam86模式匹配将值与它们构造的_constructors_匹配.列表有两个构造函数`[]`用于空列表,`(:)`用于将一个元素包含在列表中.模式`(x:xs)`匹配每个非空列表,`(x:y:zs)`匹配至少有两个元素的列表. (4认同)