【问题标题】:Is it possible to access a specific piece of a custom data type in Haskell?是否可以在 Haskell 中访问特定的自定义数据类型?
【发布时间】:2017-10-04 23:40:45
【问题描述】:

我对 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

【问题讨论】:

  • 当然:let (Let name val body) = expr in …name…,如果您知道exprLet。或者在函数中使用任何其他形式的模式匹配或case
  • 通常当您询问有关 Haskell 的问题时,如果可以的话,明确告诉我们您尝试编写的函数的 type 会很有用。思考这个问题是一个很好的练习,也可以帮助你写出更清晰的问题。
  • @ChrisMartin 我正在做一些家庭作业,所以我不希望任何人直接为我解决问题。但我想做的是创建一个函数,它采用Expr 数据类型并将Exprxml 表示形式作为字符串返回。如果你没有真正阅读可能没有多大意义的家庭作业讲义。

标签: haskell functional-programming custom-data-type


【解决方案1】:

模式匹配就是你的答案。

这样的事情应该可以解决问题:

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 所提到的,还有许多其他地方可以使用模式匹配,例如letcase 语句,只要始终确保处理您的价值可能在那个时候出现的所有情况你的程序。

【讨论】:

  • 哦,哇,如果我没记错的话,我知道使用 wildcards?,但由于某种原因,我并没有真正点击。
  • 其实这样的分段函数定义就是myfunction x = case x of (Let str _ _) = ...的语法糖。
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多