如果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的数据构造函数之一,它就是字段的一项不错的功能,您无需关心它是哪个数据构造函数即可执行此操作。

09-11 17:17