与Haskell中的排序函数有点混淆

时间:2015-05-20 18:32:00

标签: haskell recursion functional-programming

sorted :: Ord a => [a] -> Bool
sorted xs = and [x <= y | (x,y) <- pairs xs]

任何人都可以向我解释and之后这个随机=正在做什么吗?它在我编译它时起作用,但它对我来说没有逻辑意义。是因为Haskell以递归方式工作并使用and来比较下一个项目吗?

非常感谢任何见解。

2 个答案:

答案 0 :(得分:8)

如果在某处定义了函数pairs :: [a] -> [(a, a)],则表达式为

[x <= y | (x,y) <- pairs xs]

是布尔值的列表(即,其类型为[Bool])。 and是一个类型为[Bool] -> Bool的函数:如果列表中的所有布尔值均为True且{{1},则会收到布尔值列表并返回True否则。

False是一个函数应用程序(and [x <= y | (x,y) <- pairs xs]正在应用于列表推导创建的值。)

有一点需要注意的是,相比之下,Haskell没有很多特殊的关键词。许多操作由函数表示,而不是由特殊语法或关键字表示。

答案 1 :(得分:1)

and不是取逻辑和两个布尔值的函数;这是&&(类型为Bool -> Bool -> Bool)。

and的类型为[Bool] -> Bool;它通过“和它们全部”将任意数量的布尔值压缩为单个布尔值。