首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell记录模式匹配

Haskell记录模式匹配
EN

Stack Overflow用户
提问于 2016-06-27 19:16:16
回答 1查看 15.8K关注 0票数 44

我正在寻找一种在不需要实际数据的情况下简化函数模式的方法:

代码语言:javascript
复制
data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500

有没有一种方法可以创建一个更简单的模式来匹配C,只需丢弃这些值?

hsdev添加了一个提示“提示:使用记录模式”,但Google在这一点上并没有帮到我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 19:33:04

您可以像这样使用记录模式:

代码语言:javascript
复制
data X = A | B {name :: String} | C {x::Int, y::Int, name::String}

myfn :: X -> Int
myfn A = 50
myfn B{} = 200
myfn C{} = 500

记录模式允许您为构造函数的字段命名。您还可以执行以下操作:

代码语言:javascript
复制
myfn C{name=n} = length n

因此您可以看到,您只能在所需的特定字段上进行模式匹配。

注意:即使对于不使用record语法的数据类型,也可以使用空记录模式:

代码语言:javascript
复制
data A = A Int | B Int Int

myfn A{} = 1
myfn B{} = 2

这很好。还有许多与记录模式相关的其他扩展:

  • RecordWildCards允许您编写类似于C{..}等效于模式的内容:C{x=x, y=y, name=name},即它匹配所有字段,您现在在作用域x中具有与x字段匹配的值etc.
  • NamedFieldPuns允许您将C{name}编写为等效于C{name=name},因此name现在在作用域中并包含与name字段匹配的值。

请记住,使用记录模式并不妨碍您以位置的方式使用构造函数,因此您仍然可以编写:

代码语言:javascript
复制
myfn (B _) = 200

它只是添加了一些功能。

票数 92
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38052553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档