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

问题描述 投票:4回答:1

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

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 }
haskell lazy-evaluation suppress-warnings
1个回答
4
投票

正如在评论中提到的,有一种选择是使用通用型,无论是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
© www.soinside.com 2019 - 2024. All rights reserved.