【发布时间】:2016-09-12 18:40:23
【问题描述】:
在处理 Haskell 项目时,我正在处理来自 FSNotify 包的 Event 数据类型。 Event的构造函数都是:
Added FilePath UTCTime
Modified FilePath UTCTime
Removed FilePath UTCTime
在我的代码中,我只对从Event 中提取FilePath 感兴趣并执行相同的操作,而不管类型构造函数如何;因此,我很想制作一个 lambda。
不幸的是,当我将 case 表达式放入 lambda 以针对所有三种情况进行模式匹配时,代码的可读性会降低;考虑到类型构造函数的相对同质性,是否有一些内置习语可以在一个表达式中仅提取 FilePath 而无需手动模式匹配?
我尝试在调用 watchDir 操作时将此表达式作为匿名函数传递:
wm <- startManager
sw <- watchDir wm "." (\_ -> True) (\(_ f t) -> putStrLn f)
但是,可以预见的是,lambda 模式匹配中的 don't-care 值会导致解析错误。
【问题讨论】:
-
为什么不用这个模块提供的
eventTime/eventPath访问器函数呢? -
这实际上是一个很好的解决方案,并且解决了我的问题。我在阅读文档时忽略了它。我将把这个问题留一会儿,因为我有兴趣看看是否有一个通用的等价物。
-
我认为应该只有一个构造函数
Event FilePath UTCTime EventType和data EventType = Added | Modified | Removed。 -
@chepner,我对这个库一无所知,但这个选择可能有性能原因。
-
请问您为什么接受这个答案?您是否决定修改库以满足您的需要?如果您的问题是在一般环境中解决该问题,那么我建议您改写它以澄清这一点。问 A 的问题和回答 B 的公认答案是没有意义的。
标签: haskell lambda pattern-matching