我对haskell和一般的函数式编程都很陌生,我在haskell上的两本不同的书之间切换回来和第四,但我似乎无法找到我的问题的答案。假设我有一个自定义数据类型,如下面的那个
data Expr
= Let String Expr Expr
| Binary BinOp Expr Expr
| Unary UnOp Expr
| Literal Literal
| Var String
我有一个这个数据类型的实例,它是第一个构造函数Let String Expr Expr
的形式,是否可以访问Expr
的特定部分?例如,如果我想访问该特定实例中的String
。
答案 0 :(得分:4)
模式匹配是你的答案。
这样的事情可以解决问题:
myfunction :: Expr -> SomeReturnType
myfunction (Let str _ _) = doSomethingWith str -- "str" here is your string
你也想要处理其他情况,所以你不会导致运行时错误:
myfunction :: Expr -> SomeReturnType
myfunction (Let str _ _) = doSomethingElse str
myfunction (Binary _ _ _) = somethingEvenDifferent
myfunction (Unary _ _) = etc
--- etc...
_
只是说要忽略构造函数中该位置的值。
另外,正如@Bergi所提到的,还有许多其他地方可以使用模式匹配,比如let
或case
语句,只需要始终确保处理您的值可能存在的所有情况在你的程序中的那一点。