0

我正在尝试实现一个简单的函数,它执行以下操作:它采用以下格式的元组(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) 

编译后,我收到一堆“与预期类型不匹配...”的错误。我认为这是初学者的错误,但因为我是初学者...... :)

4

3 回答 3

4

这里有几件事是错误的:

  1. => 用于类型类限制
  2. a 应该是 Int,你已经知道了
  3. 您必须返回正确的类型(因此将最终值包装在构造函数 Single 和 Tuple 中)

data CounterElem a = Single a | Tuple (Int, a)

p11helper :: (Int, a) -> CounterElem a
p11helper (1, x) = Single x
p11helper p = Tuple p
于 2013-11-01T21:33:27.720 回答
1

CounterElem是数据类型,而不是类型类,因此您不能p11helper :: CounterElem c => ...在类型签名中使用。

您还必须将结果包装在适当的构造函数中,如下所示。

p11helper :: (Int, a) -> CounterElem a
p11helper (1, x) = Single x
p11helper t      = Tuple t
于 2013-11-01T21:33:26.833 回答
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) 
于 2013-11-01T21:33:20.200 回答