Haskell:具有多态相等函数的递归
好的,我们还没有学习多态函数,但是我们仍然需要编写这段代码Haskell:具有多态相等函数的递归,haskell,polymorphism,Haskell,Polymorphism,好的,我们还没有学习多态函数,但是我们仍然需要编写这段代码 Given: nameEQ (a,_) (b,_) = a == b numberEQ (_,a) (_,b) = a == b intEQ a b = a == b member :: (a -> a -> Bool) -> a -> [a] -> Bool 我补充说: member eq x ys | length ys < 1 = False | head(ys)
Given:
nameEQ (a,_) (b,_) = a == b
numberEQ (_,a) (_,b) = a == b
intEQ a b = a == b
member :: (a -> a -> Bool) -> a -> [a] -> Bool
我补充说:
member eq x ys | length ys < 1 = False
| head(ys) == x = True
| otherwise = member(x,tail(ys))
不太清楚我需要在这里做什么。关于这方面的任何帮助或文档都将非常有用。谢谢 各种事情(我不打算写完整答案,因为这是家庭作业):
length ys<1
可以更简单地表示为null ys
head(ys)
通常写为head ys
成员eq x(y:ys)=…
将匹配非空案例==
进行比较。但是您应该使用所提供的eq
函数成员(x,(tail(ys))
应该是成员x(tail(ys)
你掩饰的那些错误“不是正确的类型以及其他一些东西”很重要。它们告诉你哪里错了 例如,我第一次将您的代码放入
ghc
时,我得到:
Couldn't match expected type `a -> a -> Bool'
against inferred type `(a1, [a1])'
In the first argument of `member', namely `(x, tail (ys))'
In the expression: member (x, tail (ys))
In the definition of `member':
member eq x ys
| length ys < 1 = False
| head (ys) == x = True
| otherwise = member (x, tail (ys))
当你明确表示:
member x (tail ys)
逗号在Haskell中的意思是你没有想到的
一旦我做了更改,它再次抱怨您将eq
参数省略为member
如果您还没有了解Haskell typeclasses,那么之后的错误就更难了,但可以说您需要使用传入的
eq
函数进行比较,而不是=
,因为成员中的参数a
:(a->a->Bool)->a->[a]->Bool
不要导出Eq
,不能使用==
来比较它们,
而是必须使用给定的函数eq
因此,您的代码可能如下所示:
member :: (a -> a -> Bool) -> a -> [a] -> Bool
member eq x ys
| length ys < 1 = False
| eq x (head ys) = True
| otherwise = member eq x (tail ys)
通过使用任何一种工具,您可以将其简化得更多:
member'' :: (a -> a -> Bool) -> a -> [a] -> Bool
member'' f a = any (f a)
对于第二点:不仅那里的参数是不必要的,它们实际上会欺骗你,让你相信东西是以一种不同的方式分组的;例如,
fooab(c)
用三个参数调用foo
,而不是两个参数。你当时的意思可能是fooa(bc)
是的,我们必须使用我们得到的。因此,成员eq x(y:ys)是不可能的。但是空的ys是有帮助的。谢谢。这确实有帮助。好的,我不知道eq函数。是的,我想我曾经有过,并且我不断出现错误(可能是因为==)。谢谢您的帮助。@Matt:eq
不是您不知道的库函数——它是作为参数传递给您编写的成员
函数的!
member :: (a -> a -> Bool) -> a -> [a] -> Bool
member eq x ys
| length ys < 1 = False
| eq x (head ys) = True
| otherwise = member eq x (tail ys)
member' :: (a -> a -> Bool) -> a -> [a] -> Bool
member' eq x (y:ys)
| eq x y = True
| otherwise = member' eq x ys
member' _ _ [] = False
member'' :: (a -> a -> Bool) -> a -> [a] -> Bool
member'' f a = any (f a)