Haskell记录模式匹配

the*_*uke 29 haskell record pattern-matching algebraic-data-types

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

data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500
Run Code Online (Sandbox Code Playgroud)

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

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

Bak*_*riu 62

你可以使用这样的记录模式:

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
Run Code Online (Sandbox Code Playgroud)

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

myfn C{name=n} = length n
Run Code Online (Sandbox Code Playgroud)

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

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

data A = A Int | B Int Int

myfn A{} = 1
myfn B{} = 2
Run Code Online (Sandbox Code Playgroud)

这可以.还有许多与记录模式相关的其他扩展:

  • RecordWildCards允许你编写类似于C{..}模式的东西:C{x=x, y=y, name=name},即它匹配所有字段,你现在在范围内x具有与x字段匹配的值等.

  • NamedFieldPuns允许您写入C{name}等效C{name=name},因此name现在在范围内并包含与该name字段匹配的值.

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

myfn (B _) = 200
Run Code Online (Sandbox Code Playgroud)

它只增加了功能.

  • 遗憾的是,Google对"haskell记录模式"没有多大帮助.我已经重新命名了这个问题,也许这会让其他人更容易被发现. (2认同)