在Haskell中更改属性

Kev*_*vin 0 haskell functional-programming

如何增加属性?我创建了一个用户类型

data user = User{
username :: String,
passwort :: String,
points :: Int
}

user = user {username ="Test",
             passwort="test123",
             points=100
             }

Run Code Online (Sandbox Code Playgroud)

我想将点数增加10,所以我尝试做类似其他编程语言的操作 points += 10

userplus10 = user{points = points +10}
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这不起作用)创建一个新用户,但在点上具有另一个值。

lef*_*out 7

它确实有效,但是您需要指定要增加的点。users,对不对?

userplus10 = user{points = points user + 10}
Run Code Online (Sandbox Code Playgroud)

不过,做这种事情的更好的方法是镜片

{-# LANGUAGE TemplateHaskell, Rank2Types #-}

import Control.Lens

data User = User
   { _username :: String,
   , _passwort :: String,
   , _points :: Int
   }
makeLenses ''User

user = user {username ="Test", passwort="test123", points=100}

userPlus10 = user & points +~ 10
Run Code Online (Sandbox Code Playgroud)

  • [This](http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html)是一篇很棒的文章,适用于Haskell相对较新的人,它讲述了透镜如何使您能够撰写“ OO查找”代码。同样,虽然整个Lens软件包确实是野兽,但那里有各种“简化”的Lens软件包,它们为您提供了所有最常用的功能,而无需大量依赖,例如。[这个](http://hackage.haskell.org/package/lens-simple) (2认同)