【发布时间】:2021-01-23 08:39:10
【问题描述】:
是否可以简化这个函数的定义,如果l为空则返回[[]],否则返回l?
f :: Eq t => [[t]] -> [[t]]
f l = if l == [] then [[]] else l
例如。在 python 中我可以这样做:
f = lambda l: l or [[]]
我想到了applicative:
f l = l <|> [[]]
但如果l非空,它会附加[]
有没有什么方法可以在 Haskell 中更优雅地做到这一点?
【问题讨论】:
-
您可以做的一个小改进是将
l == []替换为null l。更重要的是,我想你可以使用f = bool <$> id <*> (const [[]]) <*> null,但这是更“优雅”还是更模糊,还有待商榷。 Python 代码工作的唯一原因是空列表自动转换为“假”,因此可以与逻辑运算符一起使用; Haskell 的类型不是那么弱,所以在 Haskell 中找到这样一个优雅的解决方案会有点棘手。 -
嗯,刚刚想到了另一种可能的解决方案,利用
Data.List.NonEmpty:toList . fromMaybe (pure []) . nonEmpty。但同样,它比优雅更令人困惑。
标签: list haskell default-value