我正在尝试编写一个接受列表的函数,如果它按排序顺序则返回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
答案 0 :(得分:9)
你的模式几乎是正确的,你只需用括号括起来:
myordered (y:x:xs)
另请注意,y
中的括号不需要x
和y <= 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
答案 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