Haskell是否为许多可能的数据构造函数提供了模式匹配的习惯用法?

Jul*_*les 2 lambda haskell pattern-matching

在Haskell项目上工作,我正在处理FSNotify包中的Event数据类型.所有的构造函数都是:Event

Added FilePath UTCTime
Modified FilePath UTCTime
Removed FilePath UTCTime
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试在调用该watchDir操作时将此表达式作为匿名函数传递:

 wm <- startManager
 sw <- watchDir wm "." (\_ -> True) (\(_ f t) -> putStrLn f)
Run Code Online (Sandbox Code Playgroud)

但是,可以预见,lambda模式匹配中的无关值会导致解析错误.

dir*_*rkt 8

最简单的方法是在类型声明中实际反映备选方案的同质性,而不是仅仅观察它:

data Action = Added | Modified | Removed

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

f :: Event -> FilePath
f (FileEvent _ path _) = path
Run Code Online (Sandbox Code Playgroud)

一般来说,Haskell无法知道所有构造函数的替代方法都具有相同数量的参数和相同的类型,所以不,你不能抽象选择替代方案.