可以在Haskell中访问自定义数据类型的特定部分吗?

可以在Haskell中访问自定义数据类型的特定部分吗?,haskell,functional-programming,custom-data-type,Haskell,Functional Programming,Custom Data Type,我对haskell非常陌生,一般来说,函数式编程,我会在两本不同的haskell书籍之间切换,但我似乎找不到我问题的答案。假设我有一个如下所示的自定义数据类型 data Expr = Let String Expr Expr | Binary BinOp Expr Expr | Unary UnOp Expr | Literal Literal | Var String 我有一个数据类型的实例,它是第一个构造函数的形式,可以访问该构造函数的特定部分吗?例如,如果我想访问该特

我对haskell非常陌生,一般来说,函数式编程,我会在两本不同的haskell书籍之间切换,但我似乎找不到我问题的答案。假设我有一个如下所示的自定义数据类型

data Expr
  = Let String Expr Expr
  | Binary BinOp Expr Expr
  | Unary UnOp Expr
  | Literal Literal
  | Var String

我有一个数据类型的实例,它是第一个构造函数的形式,可以访问该构造函数的特定部分吗?例如,如果我想访问该特定实例中的
字符串

模式匹配是您的答案

像这样的事情应该可以做到:

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
语句,只要始终确保在程序中处理您的值可能位于该点的所有情况

模式匹配是您的答案

像这样的事情应该可以做到:

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
语句,只要始终确保在程序中处理您的值可能位于该点的所有情况

当然:
let(let name val body)=expr in…name…
,如果您知道
expr
let
。或者在函数中使用任何其他形式的模式匹配,或者在您询问有关Haskell的问题时经常使用
case
,如果可以,请明确告诉我们您尝试编写的函数的类型。思考这个问题是一个很好的练习,也会帮助你写一个更清晰的问题。@ChrisMartin我正在做一些家庭作业,所以我不想让任何人直接帮我解决这个问题。但我要做的是创建一个函数,该函数接受
Expr
数据类型,并将该
Expr
xml
表示形式作为字符串返回。如果你知道
expr
是一个
let
,那么一定要:
let(let name val body)=expr in…name…
。或者在函数中使用任何其他形式的模式匹配,或者在您询问有关Haskell的问题时经常使用
case
,如果可以,请明确告诉我们您尝试编写的函数的类型。思考这个问题是一个很好的练习,也会帮助你写一个更清晰的问题。@ChrisMartin我正在做一些家庭作业,所以我不想让任何人直接帮我解决这个问题。但我要做的是创建一个函数,该函数接受
Expr
数据类型,并将该
Expr
xml
表示形式作为字符串返回。如果我没记错的话,我知道如何使用通配符,但出于某种原因,我并没有真正理解它。事实上,这种分段函数定义是
myfunction x=case x of(Let str uuu)的语法糖=…
。噢,如果我没记错的话,我知道如何使用通配符,但出于某种原因,我并没有真正理解它。事实上,这种分段函数定义是(
myfunction x=case x of(Let str)=…
的语法糖。