Haskell"由于使用`/ ='"而没有(Eq a)的实例

时间:2015-02-18 04:25:48

标签: haskell

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

我已经写完了这个功能,它完美无缺:

singleton x = x /= [] && x == take 1 (x) 

如果我调用singleton [1],它会按预期返回true。 如果我调用singleton []或singleton [1,2,3],它会按预期返回false。

然而,我的教授希望我们正确地记录代码(我不确定这是什么叫做,但是它告诉haskell期望从函数输入和输出的内容):

singleton :: [a] -> Bool

据我所知,这应该有效,但是一旦我有这个,编译器会说"没有使用' / =&#39产生的(Eq a)实例;"

有没有人能指出我正确的方向来获取编译的代码(我真的不知道它被称为什么)函数声明?

谢谢!

1 个答案:

答案 0 :(得分:7)

在您的代码中:

singleton x = x /= [] && x == take 1 (x) 

你做了一个平等测试,x == take 1 x。这会比较列表中的所有元素,看它们是否相等,因此您的元素必须“可比”。这就是Eq a的全部意义所在。以下内容解决了您的问题:

singleton :: (Eq a) => [a] -> Bool
singleton x = x /= [] && x == take 1 (x)

但这可能不是你想要的,因为那时你的类型必须具有可比性。您应该能够检查列表是否是单例而不比较元素。但这对你来说是一种锻炼。提示:它涉及模式匹配。