在Haskell中键入匹配

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.


yai*_*chu 7

你可以使用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"和每一个BoolTrue.