Chr*_*non 4 haskell types pattern-matching matching
如果SomeType定义为:
data SomeType = X {myBool :: Bool}
| Y {myString :: String}
| Z {myString :: String}
Run Code Online (Sandbox Code Playgroud)
我会更新一个任意的X,取决于他的类型如下:
changeST :: SomeType -> SomeType
changeST (X b) = (X True)
changeST (Y s) = (Y "newString")
changeST (Z s) = (Z "newString")
Run Code Online (Sandbox Code Playgroud)
第三行和第四行完全相同,它们更新给定类型的字符串.有没有办法用一个替换这两行,例如.通过将类型分配给变量?
Dan*_*Dan 17
不是通过将类型分配给变量,而是通过进行字段替换:
changeST :: SomeType -> SomeType
changeST (X b) = (X True)
changeST st = st { myString = "newString" }
Run Code Online (Sandbox Code Playgroud)
这将返回与其参数相同的st,但myString替换了字段的值.这是字段的一个很好的功能,你可以做到这一点,而不关心它是什么数据构造函数,只要它是使用的数据构造函数之一myString.
你可以使用Scrap-Your-Boilerplate.
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Generics
data SomeType
= X { myBool :: Bool }
| Y { myString :: String }
| Z { myString :: String }
deriving (Data, Typeable)
changeST :: SomeType -> SomeType
changeST = everywhere (mkT (const True)) . everywhere (mkT (const "newString"))
Run Code Online (Sandbox Code Playgroud)
这changeST改变了每个内部String在结构上"newString"和每一个Bool来True.