我刚刚开始进入类中的函数式编程世界.作为赋值的一部分,我们必须编写一个函数来确定列表是否是单例(如果列表中只有一个元素)
我写了这个函数,它工作得很好:
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)的实例"
任何人都可以指出我正确的方向来获得编译的代码(我真的不知道它叫什么)函数声明的位?
谢谢!
在你的代码中:
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)
但这可能不是你想要的,因为那时你的类型必须具有可比性.您应该能够检查列表是否是单例而不比较元素.但这对你来说是一种锻炼.提示:它涉及模式匹配.
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |