我有以下数据类型:
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'与每个值分开?
首先,错误消息告诉你,你正在使用(+)的功能,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)
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |