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)
没有数组.
(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"