我正在尝试从Haskell Road to Logic学习Haskell 并且遇到了这个例子:
mnmInt :: [Int] -> Int
mnmInt [] = error "empty list"·
mnmInt [x] = x
mnmInt (x:xs) = min x (mnmInt xs)
我理解这些函数会列出Int
-
检查是否为空
如果不
检查它是否是带有1 int的列表,如果返回x则返回x
如果不
使用xs参数将mnmInt插入min。
它是如何达到基本情况的? xs代表什么?
min implementation:
min' :: Int -> Int -> Int
min' x y | x <= y = x
| otherwise = y
不接受数组。
答案 0 :(得分:5)
(x:xs)
是模式匹配语法。模式匹配允许您“解构”数据类型并将它们绑定到名称。在这种情况下,x是列表的头部,xs是尾部。 min'
不需要列表,因为x是列表的头部,而不是列表本身。
min'
本身会找到两个Ints
之间的最小值,mnmInt
如果传入的列表看起来像{{1},最终会扩展到(min' 1 (min' 2 (min' 3 4)))
之类的值}}
如果您手动评估代码,很容易看到,我强烈建议您尝试。请记住,[1,2,3,4]
是两个名称,它们是列表的头部和尾部。您可能想要使用(x:xs)
这是一个示例,显示模式匹配如何与代码流相关。
:
如果你致电foo (x:y:[]) = "two"
foo ([]) = "none"
foo (_) = "some other value"
它会输出“2”,如果你foo [1,2]
它会给你“其他一些价值”,如果你foo [1,2,3]
它会返回{{} 1}}
答案 1 :(得分:1)
你可以在Haskell中以两种方式编写一个列表,首先是[1,2,3,4,5],它只是1:2:3:4:5:[]的语法糖。 现在模式(x:xs)与这样的列表匹配:
head(x:xs) = x
--> head [1,2,3,4,5] = head 1:2:3:4:5:[] = head 1:xs = 1
我希望这个例子能清楚地告诉你列表模式是如何工作的。