Haskell记录模式匹配

时间:2016-06-27 11:16:16

标签: haskell pattern-matching record algebraic-data-types

我正在寻找一种在不需要实际数据时简化功能模式的方法:

data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500

有没有办法为匹配C制作一个更简单的模式,只是丢弃这些值?

hsdev添加了一个提示"提示:使用记录模式",但谷歌没有帮助我。

1 个答案:

答案 0 :(得分:58)

您可以使用以下记录模式:

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

记录模式允许您为构造函数的字段指定名称。 你也可以这样做:

myfn C{name=n} = length n

所以你可以看到你只能在你需要的特定领域进行模式匹配。

注意:即使数据类型不使用记录语法,您也可以使用记录模式:

data A = A Int | B Int Int

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

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

  • RecordWildCards允许您编写类似于C{..}的{​​{1}}之类的内容,即它匹配所有字段,您现在拥有范围C{x=x, y=y, name=name}使用与x字段等匹配的值

  • x允许您将NamedFieldPuns写为等同于C{name},以便C{name=name}现在在范围内并包含与{{匹配的值1}} field。

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

name

只有添加功能。