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)
它只增加了功能.