关于模式匹配的Haskell问题

时间:2010-10-06 07:58:41

标签: list haskell recursion pattern-matching

我正在尝试编写一个接受列表的函数,如果它按排序顺序则返回true,否则返回false:

到目前为止我所拥有的是:

myordered [] = True
myordered [x] = True
myordered list1
 | (head list1) <= (head (tail list1)) = myordered(tail list1)
 | otherwise                           = False

根据我们的分配,所有头部和尾部操作都应记为“x:xs”类型语法。

我为防守部门提出的翻译是:

myordered y:x:xs
 | (y) <= (x) = myordered(xs)
 | otherwise  = False

基本上这个问题归结为: 如何用“x:xs”类型语法表达(head(tail list1))?

干杯, -Zigu

3 个答案:

答案 0 :(得分:9)

你的模式几乎是正确的,你只需用括号括起来:

myordered (y:x:xs)

另请注意,y中的括号不需要xy <= x。{/ p>

第二个版本中也存在语义错误:

myordered(xs)这里xs指尾巴的尾巴,但你想要整个尾巴,所以你应该myordered (x:xs)或者:

myordered (y:xs@(x:_))
 | y <= x = myordered xs
 | otherwise  = False

其中说:xs是该列表的尾部,x是该尾部的头部,_(被忽略)是尾部的尾部。

答案 1 :(得分:4)

在[{1}}

提供zipWith功能的帮助下,另一种方法可以做到这一点
Data.List

myordered xs= and $ zipWith (<=) xs (tail xs) 函数有两个列表并应用一个函数。这里它将根据条件返回一个布尔数组 zipWith获取布尔值列表,并且仅当列表中的所有值都为True

时才返回True

答案 2 :(得分:0)

怎么样

isordered :: [Int] →  Bool
isordered [] = True
isordered xs = foldl (&&) True $ zipWith (<=) xs $ tail xs

哦,只是为了好玩:

isordered :: [Int] →  Bool
isordered [] = True
isordered (x:xs) = (foldl comp (Just x) xs) /= Nothing
   where comp (Just a) b = if a ≤ b then Just b else Nothing
         comp Nothing _ = Nothing