如果SomeType定义为:
data SomeType = X {myBool :: Bool}
| Y {myString :: String}
| Z {myString :: String}
然后我将更新一个任意X,具体取决于他的类型,如下所示:
changeST :: SomeType -> SomeType
changeST (X b) = (X True)
changeST (Y s) = (Y "newString")
changeST (Z s) = (Z "newString")
第三和第四行做的非常一样,它们更新给定类型的字符串。
有没有办法用一条线代替这两条线,例如。通过将类型分配给变量?
最佳答案
不是通过将类型分配给变量,而是通过进行字段替换:
changeST :: SomeType -> SomeType
changeST (X b) = (X True)
changeST st = st { myString = "newString" }
这将返回与其参数相同的st,但是替换了
myString
字段的值。只要它是使用myString
的数据构造函数之一,它就是字段的一项不错的功能,您无需关心它是哪个数据构造函数即可执行此操作。