Haskell “哈斯克尔”;没有因使用`/='&引用;
我刚开始在课堂上进入函数式编程的世界。作为赋值的一部分,我们必须编写一个函数来确定列表是否为单例(如果列表中正好有1个元素) 我已经编写了函数,它工作得非常好:Haskell “哈斯克尔”;没有因使用`/='&引用;,haskell,Haskell,我刚开始在课堂上进入函数式编程的世界。作为赋值的一部分,我们必须编写一个函数来确定列表是否为单例(如果列表中正好有1个元素) 我已经编写了函数,它工作得非常好: singleton x = x /= [] && x == take 1 (x) 如果我调用singleton[1],它将按预期返回true。 如果我调用singleton[]或singleton[1,2,3],它将按预期返回false 但是,我的教授希望我们用以下方法正确地记录代码(我不确定这是什么,但它告诉has
singleton x = x /= [] && x == take 1 (x)
如果我调用singleton[1],它将按预期返回true。
如果我调用singleton[]或singleton[1,2,3],它将按预期返回false
但是,我的教授希望我们用以下方法正确地记录代码(我不确定这是什么,但它告诉haskell函数的输入和输出是什么):
据我所知,这应该是可行的,但一旦我有了它,编译器就会说“没有因使用“/=”而产生的(Eq a)实例”
有没有人能给我指出正确的方向,让我用这个(我真的不知道它叫什么)位函数声明来编译代码
谢谢 在您的代码中:
singleton x = x /= [] && x == take 1 (x)
你做一个相等性测试,x==取1x
。这将对列表中的所有元素进行比较,以查看它们是否相等,因此您的元素必须是“可比较的”。这就是Eq a
的全部内容。以下内容修复了您的问题:
singleton :: (Eq a) => [a] -> Bool
singleton x = x /= [] && x == take 1 (x)
但这可能不是你想要的,因为你的类型必须具有可比性。您应该能够在不比较元素的情况下检查列表是否为单例。但这对你来说是一种锻炼。提示:它涉及模式匹配。在代码中:
singleton x = x /= [] && x == take 1 (x)
你做一个相等性测试,x==取1x
。这将对列表中的所有元素进行比较,以查看它们是否相等,因此您的元素必须是“可比较的”。这就是Eq a
的全部内容。以下内容修复了您的问题:
singleton :: (Eq a) => [a] -> Bool
singleton x = x /= [] && x == take 1 (x)
但这可能不是你想要的,因为你的类型必须具有可比性。您应该能够在不比较元素的情况下检查列表是否为单例。但这对你来说是一种锻炼。提示:它涉及到模式匹配。可能的重复我不认为它是相同的,因为在另一个问题中,函数实际上需要
Eq a
,而在这个问题中,它可以重写以避免它。@rjanJohansen我认为它是相同的。你的功能也需要它。当你检查[a]==[a]时,这意味着检查a.@piojo的相等性,关键是你可以这样写函数:它得到类型[a]->Bool
,而不是(Eq a)=>[a]->Bool
。顺便说一句,[a]->Bool
部分被称为a。我认为它可能是重复的,因为在另一个问题中,函数实际上需要等式a
,而在这个问题中,它可以被重写以避免它。@ØrjanJohansen,我认为这是一样的。你的功能也需要它。当您检查[a]==[a]时,这意味着检查a.@piojo的相等性,关键是您可以以这样的方式编写函数:[a]->Bool
类型,而不是(Eq a)=>[a]->Bool
。顺便说一句,[a]->Bool
部分称为a。