【问题标题】:Create record with all fields undefined, without triggering warning创建所有未定义字段的记录,而不触发警告
【发布时间】:2020-04-08 14:16:21
【问题描述】:

我想创建一个可以模式匹配的记录类型的值,而无需填写任何字段。

data Foo = MkFoo
    { field1 :: Int
    , field2 :: Bool
    }

fun :: Foo -> Bool
fun MkFoo{..} = True

bar :: Bool
bar = fun MkFoo{}

之所以有效,是因为传递给funFoo 的所有字段都是未定义的,而fun 在其中是惰性的。当然,fun undefined 会失败,因为 fun 与记录构造函数 MkFoo 上的模式匹配。

但是,这会导致编译器警告:

MkFoo 的字段未初始化:field1field2

我想摆脱这个警告对于这个特定的实例。所以我一般不打算关闭警告(使用-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


【解决方案1】:

如 cmets 中所述,一种选择是使用泛型,无论是原版版本还是像 generics-sop 这样的帮助程序包:

{-# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2013-11-17
    相关资源
    最近更新 更多