我正在寻找一种在不需要实际数据的情况下简化函数模式的方法:
data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500有没有一种方法可以创建一个更简单的模式来匹配C,只需丢弃这些值?
hsdev添加了一个提示“提示:使用记录模式”,但Google在这一点上并没有帮到我。
发布于 2016-06-27 19:33:04
您可以像这样使用记录模式:
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因此您可以看到,您只能在所需的特定字段上进行模式匹配。
注意:即使对于不使用record语法的数据类型,也可以使用空记录模式:
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字段匹配的值。请记住,使用记录模式并不妨碍您以位置的方式使用构造函数,因此您仍然可以编写:
myfn (B _) = 200它只是添加了一些功能。
https://stackoverflow.com/questions/38052553
复制相似问题