对自定义数据类型执行操作?

Bab*_*ham 1 haskell types

我有以下数据类型:

data Users = Height Int | Age Int 
Run Code Online (Sandbox Code Playgroud)

然后我有一个年龄列表:

myList = [Age 44, Age 54, Age 21, Age 34, Age 22]
Run Code Online (Sandbox Code Playgroud)

我想申请这个功能:

myFunction :: [Users] -> [Users]
myFunction li = [x + 1 | x <- li]
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

"No instance for (Num Users) arising from a use of ‘+’"
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我是否需要将'Age'与每个值分开?

Sch*_*oon 8

首先,错误消息告诉你,你正在使用(+)的功能,Users它是没有定义.

所以,你可以做Users的实例Num,这意味着你还需要定义(-),(*),negate,...对Users,这似乎很奇怪.

也许你需要这样的东西:

data User = User {height :: Int, age :: Int } deriving (Show)

addToHeight :: Int -> User -> User
addToHeight x (User h a) = User (h+x) a
Run Code Online (Sandbox Code Playgroud)

然后使用:

let users = [User 180 20, User 185 22]
fmap (addToHeight 1) users
Run Code Online (Sandbox Code Playgroud)

-

把语义放在一边:

plus :: Int -> Users -> Users
plus x (Age a) = Age (a+x)
plus x (Height h) = Height (h+x)
Run Code Online (Sandbox Code Playgroud)