gpt4 book ai didi

haskell - Haskell 是否提供了与许多可能的数据构造函数进行模式匹配的习语?

转载 作者:行者123 更新时间:2023-12-03 23:14:45 24 4
gpt4 key购买 nike

在 Haskell 项目上工作,我正在处理 Event来自 FSNotify 的数据类型包裹。 Event 的构造函数都是:

Added FilePath UTCTime
Modified FilePath UTCTime
Removed FilePath UTCTime

在我的代码中,我只对提取 FilePath 感兴趣。来自 Event无论类型构造函数如何,都执行相同的操作;因此,我很想制作一个 lambda。

不幸的是,当我删除 case 时,代码的可读性会降低。将表达式转换为 lambda 以针对所有三种情况进行模式匹配;是否有一些内置的习惯用法可以仅提取 FilePath鉴于类型构造函数的相对同质性,在一个表达式中而不必手动模式匹配?

我试过在对 watchDir 的调用中将此表达式作为匿名函数传递。行动:
 wm <- startManager
sw <- watchDir wm "." (\_ -> True) (\(_ f t) -> putStrLn f)

但是,可以预见的是,lambda 模式匹配中的 don't-care 值会导致解析错误。

最佳答案

最简单的方法是在类型声明中实际反射(reflect)替代方案的同质性,而不是仅仅观察它:

data Action = Added | Modified | Removed

data Event = FileEvent Action FilePath UTCTime | OtherEvent ...

f :: Event -> FilePath
f (FileEvent _ path _) = path

一般来说,Haskell 无法知道您所有的构造函数替代方案都具有相同数量的参数和相同的类型,因此不,您不能对替代方案的选择进行抽象。

关于haskell - Haskell 是否提供了与许多可能的数据构造函数进行模式匹配的习语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39456718/

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