我正在寻找一种简化函数模式的方法,当实际数据不需要时:
data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500
有没有一种更简单的匹配模式来匹配C,只需丢弃值?
hsdev添加了一个提示“提示:使用记录模式”,但Google没有帮助我。
我正在寻找一种简化函数模式的方法,当实际数据不需要时:
data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500
有没有一种更简单的匹配模式来匹配C,只需丢弃值?
hsdev添加了一个提示“提示:使用记录模式”,但Google没有帮助我。
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{..}
的内容,它等同于模式:C{x=x, y=y, name=name}
,即匹配所有字段后,你现在可以在作用域内找到匹配 x
字段值的变量 x
等等。
NamedFieldPuns
允许您编写 C{name}
以等效于 C{name=name}
,因此现在 name
在作用域内,并包含匹配 name
字段的值。
请记住,使用记录模式并不妨碍您按位置使用构造函数,因此您仍然可以编写:
myfn (B _) = 200
它只是 增加 功能。
B
声明为普通的非记录数据类型,您仍可以使用空记录模式(B{}
)。 - Lii