gpt4 book ai didi

haskell - 编辑数据类型的构造函数时最大限度地减少代码更改

转载 作者:行者123 更新时间:2023-12-02 12:14:42 27 4
gpt4 key购买 nike

我有一个数据类型来跟踪状态。假设它看起来像这样:

data State = State String String Int

有几个函数采用一个State并返回一个新状态。例如:

convert :: State -> Int -> State
convert (State a b c) 0 = State "new" b c
convert (State a b c) 1 = State a "new" c
convert (State a b c) 2 = State a b 0

(1) 当我编辑 State 数据类型(例如,保存额外的 Int)时,我需要编辑所有函数中的模式匹配。在这种情况下使用记录语法是否更好?

data State = State { a :: String, b :: String, c :: Int }

convert :: State -> Int -> State
convert state 0 = State "new" (b state) (c state)
convert state 1 = State (a state) "new" (c state)
convert state 2 = State (a state) (b state) 0

现在,在更改数据类型State 时,我不必编辑模式匹配。不过,右侧的构造函数调用也遇到了同样的问题。有没有解决的办法?我可以定义一些函数来创建 State(仅当 State 构造函数更改时需要操作那些函数)。

(2) 我想还有其他方法可以处理这个问题...

最佳答案

您可以使用记录更新语法:

convert state 0 = state { a = "new" }
convert state 1 = state { b = "new" }
convert state 2 = state { c = 0 }

或者您可以使用镜头(特别是 Edward 的 lens 库):

{-# LANGUAGE: TemplateHaskell #-}
import Control.Lens

data State = State
{ _a :: String
, _b :: String
, _c :: Int
} deriving (Eq, Show, Read)
makeLenses ''State

convert :: Int -> State -> State
convert 0 = set a "new"
convert 1 = set b "new"
convert 2 = set c 0
-- Or using the infix version of set
-- convert 0 = a .~ "new"
-- convert 1 = b .~ "new"
-- convert 2 = c .~ 0

如果您想了解更多有关镜头库中发生的黑魔法的信息,有很多很多教程,并且文档通常都很好,但这超出了这个问题的范围

关于haskell - 编辑数据类型的构造函数时最大限度地减少代码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com