作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码说明了我的意图。我想要模式匹配,如果没有结果是 Nothing
,如果匹配结果是 Just some
data MyData =
A Int
| B String
| C
ifA (A i) = Just i
ifA _ = Nothing
ifB (B str) = Just str
ifB _ = Nothing
ifC C = Just ()
ifC _ = Nothing
mbMult3 i = Just (i*3)
concWorld str = Just (str ++ "World")
example1 v = ifA v >>= mbMult3
example2 v = ifB v >>= concWorld
-- example2 (B "Hello ,") == Just "Hello, World"
-- example2 (A 3) == Nothing
还有其他方法可以实现ifA
ifB
ifC
吗?
编辑:
lens
库可能有东西。但目前我对 lens
一无所知。ifC
最佳答案
Prisms † 来自lens封装模型这个。您可以使用 makePrisms
生成适合您类型的棱镜,然后使用 ^?
(或其等效前缀 preview
)访问 sum 类型的成员,如果提供了不同的值,则生成 Nothing
:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data MyData
= A Int
| B String
| C
deriving (Show)
makePrisms ''MyData
ghci> A 42 ^? _A
Just 42
ghci> A 42 ^? _B
Nothing
ghci> C ^? _C
Just ()
棱镜的好处在于它们可以与其他光学器件组合(例如 lenses 、 folds 和 traversals ),并使用它们通过组合棱镜来遍历嵌套和类型:
ghci> (A 42, C) ^? _1._A
Just 42
ghci> (B "hello", C) ^? _1._A
Nothing
ghci> Just (A 42) ^? _Just._A
Just 42
ghci> Just (B "hello") ^? _Just._A
Nothing
ghci> Nothing ^? _Just._A
Nothing
lens包相当复杂,解释其所有功能远远超出了本答案的范围。如果您不需要太多,您的解决方案可能就很好。但是,如果您发现自己经常编写此类代码,那么只要您愿意接受陡峭的学习曲线和经常令人困惑的类型错误,镜头可能会有所帮助。
<小时/>† 更一般地说,^?
适用于任何 Fold
产生零个或一个值(或更多,它只是忽略除第一个值之外的所有值),但棱镜是专门为考虑和类型而设计的,因此它们在这里更相关。
关于haskell - 如果模式与 `Maybe a` 匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48365311/
我是一名优秀的程序员,十分优秀!