创建所有字段未定义的记录,不触发警告。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建所有字段未定义的记录,不触发警告。相关的知识,希望对你有一定的参考价值。
我想创建一个可以进行模式匹配的记录类型的值,而无需填写任何字段。
data Foo = MkFoo
{ field1 :: Int
, field2 :: Bool
}
fun :: Foo -> Bool
fun MkFoo{..} = True
bar :: Bool
bar = fun MkFoo{}
这样做的原因是,记录类型的所有字段都是 Foo
传给 fun
是未定义的,并且 fun
是懒在其中。当然了 fun undefined
会失败,因为 fun
记录构造函数的模式匹配 MkFoo
.
然而,这将导致一个编译器警告。
- 字段的
MkFoo
未初始化。field1
,field2
我想摆脱这个警告 对于这种特殊情况. 所以,我并不是想关闭一般的警告(与 -Wno-missing-fields
). 我也不希望改变 fun
(我可以直接把图案搭配在 MkFoo
不可辩驳的)。) 我也希望避免写出所有领域的内容。MkFoo
如
bar = fun MkFoo{ field1 = undefined, field2 = undefined }
答案
正如在评论中提到的,有一种选择是使用通用型,无论是vanilla版本还是像下面这样的帮助包 仿制药:
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-} -- derive stock, anyclass stuff
{-# LANGUAGE ImportQualifiedPost #-} -- GHC >= 8.10
import GHC.Generics
import Generics.SOP qualified as SOP
import Generics.SOP.NP (pure_NP)
data Foo
= MkFoo
{ field1 :: Int,
field2 :: Bool
}
deriving stock (Generic)
deriving anyclass (SOP.Generic)
allundef :: Foo
allundef = SOP.productTypeTo $ pure_NP undefined
以上是关于创建所有字段未定义的记录,不触发警告。的主要内容,如果未能解决你的问题,请参考以下文章