【发布时间】:2023-04-05 10:56:01
【问题描述】:
我经常编写函数来剥离新类型的唯一构造函数,例如在以下函数中返回第一个不是 Nothing 的参数:
process (Pick xs) = (\(First x) -> x) . mconcat . map (First . process) $ xs
我认为 lambda 是不必要的冗长。我想写这样的东西:
process (Pick xs) = -First . mconcat . map (First . process) $ xs
Haskell 的元编程工具是否允许类似的事情?也欢迎以更简洁的方式解决此问题的任何其他解决方案。
UPD。已请求完整代码:
data Node where
Join :: [Node] -> Node
Pick :: [Node] -> Node
Given :: Maybe String -> Node
Name :: String -> Node
process :: Node -> Maybe String
process (Join xs) = liftM os_path_join (mapM process xs)
process (Pick xs) = getFirst . mconcat . map (First . process) $ xs
process (Name x) = Just x
process (Given x) = x
【问题讨论】:
-
听起来像
coerce。 -
process的类型应该是什么?可以使用newtype包来隐藏大部分内容。我所能做的就是Pick必须属于递归类型,因为Pick :: [a] -> PickType和process :: PickType -> Maybe a,但是First . process :: PickType -> First a,所以xs :: [PickType]? -
这只是一个玩具示例,但我会将其添加到 OP 中。
标签: haskell constructor strip syntactic-sugar newtype