任务:
写一个递归的Haskell函数,它得到2个有序列表,函数决定它们中的每个元素是否相等(如果其中一个相同,则函数值为
False
)。例如:
myfunction [1..5] [6..10] == True
myfunction [1..5] [5..10] == False
我无法使用elem
功能。
我可以使用递归和案例分开选择。
功能类型:
myfunction :: Ord a => [a] -> [a] -> Bool
我试过这样的事情:
myfunction :: Ord a => [a] -> [a] -> Bool
myfunction [] list = True
myfunction list [] = True
myfunction (x:xs) (y:ys)
| x == y = False
| xs == myfunction ???????? = False
但它不起作用......
答案 0 :(得分:2)
(这个答案实际上只是你在答案表中收到的评论。)你按照以下方式实施:
myFunction [] _ = True
myFunction _ [] = True
myFunction (x : xs) (y : ys) = case compare x y of
LT -> myFunction xs (y : ys)
EQ -> False
GT -> myFunction (x : xs) ys
这是有效的,因为如果x
小于y
,x
也比ys
中的任何元素更小(因此不相同,这是我们真正想知道的) 1}}。这意味着我们可以忽略它并检查其余的列表。当x
大于y
时,反之亦然。