繁体   English   中英

Haskell“没有因使用'/ ='而引起(Eq a)的实例”

[英]Haskell “No instance for (Eq a) arising from a use of `/='”

我只是开始在类中进入函数式编程领域。 作为分配的一部分,我们必须编写一个函数,该函数确定列表是否为单例(如果列表中恰好有1个元素)

我已经编写了函数,并且可以正常工作:

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

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

但是,我的教授希望我们使用以下代码正确地记录代码(我不确定这叫什么,但是它告诉haskell从函数的输入和输出中可以得到什么):

singleton :: [a] -> Bool

据我所知,这应该可行,但是一旦有了这个,编译器就会说:“(Eq a)的实例不会因使用'/ ='而产生”

有人能指出我正确的方向来使用该函数声明的一部分(我真的不知道它叫什么)来编译代码吗?

谢谢!

在您的代码中:

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)

但这可能不是您想要的,因为那样您的类型必须是可比较的。 您应该能够在不比较元素的情况下检查列表是否为单例。 但这是您的练习。 提示:它涉及模式匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM