Haskell “哈斯克尔”;没有因使用`/='&引用;

Haskell “哈斯克尔”;没有因使用`/='&引用;,haskell,Haskell,我刚开始在课堂上进入函数式编程的世界。作为赋值的一部分,我们必须编写一个函数来确定列表是否为单例(如果列表中正好有1个元素) 我已经编写了函数,它工作得非常好: singleton x = x /= [] && x == take 1 (x) 如果我调用singleton[1],它将按预期返回true。 如果我调用singleton[]或singleton[1,2,3],它将按预期返回false 但是,我的教授希望我们用以下方法正确地记录代码(我不确定这是什么,但它告诉has

我刚开始在课堂上进入函数式编程的世界。作为赋值的一部分,我们必须编写一个函数来确定列表是否为单例(如果列表中正好有1个元素)

我已经编写了函数,它工作得非常好:

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。