我无法正确定义类型定义

时间:2013-11-01 21:24:57

标签: haskell

我正在尝试实现一个简单的函数,它执行以下操作:它采用以下格式的元组(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 ...”错误。我认为这是一个初学者的错误,但因为我是初学者......:)

3 个答案:

答案 0 :(得分:4)

这里有一些错误:

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

  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)