Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:具有多态相等函数的递归_Haskell_Polymorphism - Fatal编程技术网

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[]=…将匹配空案例,
    成员eq x(y:ys)=…
    将匹配非空案例
  • 您正在使用
    ==
    进行比较。但是您应该使用所提供的
    eq
    函数
  • 您将参数括在成员的括号中,就好像这是Java或类似的。在Haskell中,参数由空格分隔,因此
    成员(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)