我正在尝试实现一个简单的函数,它执行以下操作:它采用以下格式的元组(Int,a),如果第一个元素是1(例如:(1,a))则返回a,否则它返回一个元组。这应该基于CounterElem数据类型。
这是我的代码:
data CounterElem a = Single a | Tuple (Int, a)
p11helper :: CounterElem c => (a, b) -> c
p11helper (1, x) = x
p11helper (y, x) = (y, x)
编译后,我得到了一堆“Cold not match expected type ...”错误。我认为这是一个初学者的错误,但因为我是初学者......:)
答案 0 :(得分:4)
这里有一些错误:
data CounterElem a = Single a | Tuple (Int, a)
p11helper :: (Int, a) -> CounterElem a
p11helper (1, x) = Single x
p11helper p = Tuple p
答案 1 :(得分:1)
CounterElem
是一种数据类型,而不是类型类,因此您无法在类型签名中使用p11helper :: CounterElem c => ...
。
您还必须将结果包装在适当的构造函数中,如下所示。
p11helper :: (Int, a) -> CounterElem a
p11helper (1, x) = Single x
p11helper t = Tuple t
答案 2 :(得分:0)
你的代码中有很多错误,所以这里只是一个正确的错误:
data CounterElem a = Single a | Tuple (Int, a)
p11helper :: (Int, a) -> CounterElem a
p11helper (1, x) = Single x
p11helper (y, x) = Tuple (y, x)