Haskell"使用`/ ='产生的(Eq a)没有实例

Mr.*_*tor 1 haskell

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

我写了这个函数,它工作得很好:

singleton x = x /= [] && x == take 1 (x) 
Run Code Online (Sandbox Code Playgroud)

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

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

singleton :: [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以指出我正确的方向来获得编译的代码(我真的不知道它叫什么)函数声明的位?

谢谢!

Has*_*ush 7

在你的代码中:

singleton x = x /= [] && x == take 1 (x) 
Run Code Online (Sandbox Code Playgroud)

你做一个平等测试,x == take 1 x.这会比较列表中的所有元素,看它们是否相等,因此您的元素必须"可比".这Eq a就是全部.以下修复了您的问题:

singleton :: (Eq a) => [a] -> Bool
singleton x = x /= [] && x == take 1 (x)
Run Code Online (Sandbox Code Playgroud)

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