创建所有字段未定义的记录,不触发警告。

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

以上是关于创建所有字段未定义的记录,不触发警告。的主要内容,如果未能解决你的问题,请参考以下文章

在创建文档时触发云功能时获取“对象可能未定义”[重复]

“未定义变量”警告,但变量已在所有进程中定义

vue.js数据可以在页面上渲染成功却总是警告提示某个字段未定义

未触发opengl片段着色器条件语句

Perl 的模板工具包可以警告未定义的值吗?

对类的公共方法禁用“未使用”警告