【发布时间】:2020-04-08 14:16:21
【问题描述】:
我想创建一个可以模式匹配的记录类型的值,而无需填写任何字段。
data Foo = MkFoo
{ field1 :: Int
, field2 :: Bool
}
fun :: Foo -> Bool
fun MkFoo{..} = True
bar :: Bool
bar = fun MkFoo{}
之所以有效,是因为传递给fun 的Foo 的所有字段都是未定义的,而fun 在其中是惰性的。当然,fun undefined 会失败,因为 fun 与记录构造函数 MkFoo 上的模式匹配。
但是,这会导致编译器警告:
•
MkFoo的字段未初始化:field1、field2
我想摆脱这个警告对于这个特定的实例。所以我一般不打算关闭警告(使用-Wno-missing-fields)。我也不打算更改fun(我可以让MkFoo 上的模式匹配无可辩驳)。我还想避免写出MkFoo的所有字段,如
bar = fun MkFoo{ field1 = undefined, field2 = undefined }
【问题讨论】:
-
这类似于 data-default 中的 GDefault (generic default),你可以尝试使用 GHC.Generics。
标签: haskell lazy-evaluation suppress-warnings