gpt4 book ai didi

haskell - 如何检查haskell记录中的所有Maybe字段是否都没有?

转载 作者:行者123 更新时间:2023-12-02 02:57:48 25 4
gpt4 key购买 nike

如果我有这样的记录:

data MaybeTest = MaybeTest {
test0 :: String
test1 :: Maybe Int,
test2 :: Maybe Float,
test3 :: Maybe Int,
test4 :: Maybe String,
test5 :: Maybe String
}
deriving (Typeable, Data, Eq, Show)
有没有一种简单的方法可以查看所有可能的字段是否都为空?如果记录符合此条件,我想返回 Nothing,否则返回 Just MaybeTest。我想避免当前调用每个 Maybe 字段并检查它们是否为 Nothing 的冗长方法。

最佳答案

像这样的东西通常需要泛型。 Data.Data泛型通常是最容易使用的。您可以定义一个查询来检查所有 Maybe x带有 isNothing 的字段谓词使用:

{-# LANGUAGE DeriveDataTypeable #-}

import Data.Maybe (isNothing)
import Data.Data (Data, gmapQ)
import Data.Generics.Aliases (ext1Q)

allNothing :: (Data d) => d -> Bool
allNothing = and . gmapQ (const True `ext1Q` isNothing)
在这里, ext1Q构造一个应用 isNothing 的查询到任何类型匹配 Maybe b申请时 const True任何非 Maybe类型。 gmapQ函数将其映射到目标类型的所有字段,从而生成一个 bool 值列表 True对于所有非 Maybe类型和 Nothing值但 False所有 Just x值。
你可以像这样测试它:
data Foo = Foo String (Maybe Int) Char (Maybe Double) deriving (Show, Data)
data Bar = Bar (Maybe [Int]) deriving (Show, Data)
在 GHCi 中:
λ> allNothing (Foo "x" Nothing 'a' Nothing)
True
λ> allNothing (Foo "x" Nothing 'a' (Just 3.14))
False
λ> allNothing (Bar Nothing)
True
λ> allNothing (Bar (Just [1..10]))
False
有了该功能,就可以轻松编写所需的功能:
checkNothing :: (Data d) => d -> Maybe d
checkNothing x | allNothing x = Nothing
| otherwise = Just x
给予:
λ> checkNothing (Foo "x" Nothing 'a' Nothing)
Nothing
λ> checkNothing (Foo "x" Nothing 'a' (Just 3.14))
Just (Foo "x" Nothing 'a' (Just 3.14))

关于haskell - 如何检查haskell记录中的所有Maybe字段是否都没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62580560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com