我刚刚开始进入课堂中的函数式编程世界。作为赋值的一部分,我们必须编写一个函数来确定列表是否是单例(如果列表中只有1个元素)
我已经写完了这个功能,它完美无缺:
singleton x = x /= [] && x == take 1 (x)
如果我调用singleton [1],它会按预期返回true。 如果我调用singleton []或singleton [1,2,3],它会按预期返回false。
然而,我的教授希望我们正确地记录代码(我不确定这是什么叫做,但是它告诉haskell期望从函数输入和输出的内容):
singleton :: [a] -> Bool
据我所知,这应该有效,但是一旦我有这个,编译器会说"没有使用' / =&#39产生的(Eq a)实例;"
有没有人能指出我正确的方向来获取编译的代码(我真的不知道它被称为什么)函数声明?
谢谢!
答案 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)
但这可能不是你想要的,因为那时你的类型必须具有可比性。您应该能够检查列表是否是单例而不比较元素。但这对你来说是一种锻炼。提示:它涉及模式匹配。