Haskell元组连接函数定义问题

sak*_*zai 2 haskell types

我试图定义一个函数,将连接两个这样的元组(Int, Char):

tupleCat :: (Integral a, Char b )=> (a, b) ->  (a, b) -> (a, [Char])
tupleCat (x1, y1) (x2, y2) =(x1+ x2, [y1] ++ [y2])
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

Type constructor `Char' used as a class ...
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Lan*_*dei 8

Char 没有类型类,它是一个类型:

tupleCat :: (Integral a) => (a, Char) ->  (a, Char) -> (a, [Char])
tupleCat (x1, y1) (x2, y2) =(x1 + x2, [y1] ++ [y2])
Run Code Online (Sandbox Code Playgroud)

如果你真的想要Ints而不是a Integral,它们也是类型:

tupleCat :: (Int, Char) ->  (Int, Char) -> (Int, [Char])
tupleCat (x1, y1) (x2, y2) =(x1+ x2, [y1] ++ [y2])
Run Code Online (Sandbox Code Playgroud)

此外,您可以考虑将此类型设置为新类型并实现Monoid类型类(如注释中所示).一种可能性是

newtype Cat = Cat (Int, String)

instance Monoid Cat where
  mempty = Cat (0, [])
  mappend (Cat (i1,s1)) (Cat (i2,s2)) = Cat (i1 + i2, s1 ++ s2)
Run Code Online (Sandbox Code Playgroud)

随着这个定义tupleCat变得简单mappend.然后你可以例如Cat在每个中连接s Foldable(例如列表).当然我不知道你的意图,所以这只是一个有根据的猜测.

  • `Char`是一个不带参数的类型构造函数.请不要混淆类型构造函数(例如`Maybe`)和值构造函数(例如`Just`或`Maybe`). (2认同)