gpt4 book ai didi

haskell - 如何定义基于总和类型的子类型过滤列表的 lambda 函数?

转载 作者:行者123 更新时间:2023-12-04 16:50:31 26 4
gpt4 key购买 nike

该示例取自“来自第一原理的 Haskell 编程”
filter 函数的目标是去除除 'DbDate' 类型的对象之外的所有对象。

在某人的 github 上,我找到了一种使用列表理解和模式匹配来过滤和类型的方法(1)。现在我试图找到一种方法来重新定义这个过滤器,使用 lambda 函数 (2) 或“if then”函数的正常“case of”。当我处理自定义数据类型时,我不知道如何正确检查函数的参数类型。

本书没有向读者介绍任何 super 特定的库函数,只是标准的映射、折叠、过滤器和你在序言中找到的其他东西。

import Data.Time

data DatabaseItem = DbString String
| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)

--List that needs to be filtered
theDatabase :: [DatabaseItem]
theDatabase =
[ DbDate (UTCTime (fromGregorian 1911 5 1)
(secondsToDiffTime 34123))
, DbNumber 9001
, DbString "Hello, world!"
, DbDate (UTCTime (fromGregorian 1921 5 1)
(secondsToDiffTime 34123))
]



--1 works fine, found on someone's git hub
filterDbDate :: [DatabaseItem] -> [UTCTime]
filterDbDate dbes = [x | (DbDate x) <- dbes]

--2 Looking for the eqivalents with lambda or "case" or "if then"
--pattern is not satisfactory

filterDbDate :: [DatabaseItem] -> [UTCTime]
filterDbDate dbes = filter (\(DbDate x) -> True) theDatabase

最佳答案

filter有类型 (a -> Bool) -> [a] -> [a]所以它不能改变你的列表类型。

根据 The Haskell 98 Report (section 3.11)您在 github desugars 上找到的代码中使用的列表理解为:

filterDbDate2 :: [DatabaseItem] -> [UTCTime]
filterDbDate2 dbes = let extractTime (DbDate time) = [time]
extractTime _ = []
in concatMap extractTime theDatabase

您可以重写 extractTime使用 case ... of :
filterDbDate3 :: [DatabaseItem] -> [UTCTime]
filterDbDate3 dbes = let extractTime item = case item of (DbDate time) -> [time]
_ -> []
in concatMap extractTime theDatabase

并用 lambda 替换它:
filterDbDate4 :: [DatabaseItem] -> [UTCTime]
filterDbDate4 dbes = concatMap (\item ->
case item of
(DbDate time) -> [time]
_ -> [])
theDatabase

但是恕我直言,您使用列表理解的原始解决方案看起来最好:
filterDbDate dbes = [x | (DbDate x) <- dbes]

关于haskell - 如何定义基于总和类型的子类型过滤列表的 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54913947/

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