Haskell 如果模式匹配结果为'maybea'
下面的代码说明了我的意图。我想进行模式匹配,如果匹配结果不是Haskell 如果模式匹配结果为'maybea',haskell,haskell-lens,Haskell,Haskell Lens,下面的代码说明了我的意图。我想进行模式匹配,如果匹配结果不是无,如果匹配结果是只是某个东西 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) concWo
无
,如果匹配结果是只是某个东西
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
是否有其他方法可以执行ifAifB
ifC
编辑:
lens
library可能有什么东西。但是我现在对镜头一无所知ifC
Nothing
:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data MyData
= A Int
| B String
| C
deriving (Show)
makePrisms ''MyData
棱镜的好处在于,它们与其他光学元件(如和)组合,并通过组合棱镜,使用它们遍历嵌套和类型:
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可能会有所帮助
†更一般地说,
^?
适用于任何产生零或一个值(或更多,它只会忽略除第一个值以外的所有值),但棱镜是专门设计的求和类型,因此它们在这里更相关。这里有一个可爱的习惯用法,我不时使用,因为我还不熟悉我的镜头
{-# LANGUAGE MonadComprehensions #-}
example1 v = [ x | A x <- pure v ] >>= mbMult3
{-#语言单体综合}
示例1 v=[x | A x>=mbMult3
您当前的版本有什么问题吗?它按预期工作,但编写那些ifA
ifB
ifC
很乏味。顺便说一句,您的ifC
与ifA
和ifB
不太一样。或许可以尝试一下()谢谢。这很有道理。我应该读什么给大师lens
?我只能找到初学者教程。@Dulgunotgon我想这取决于你所说的“大师”是什么意思.我主要是通过阅读文档和查找我需要的东西来学习如何使用它的,在学习了基础知识之后。FTR,你不能用镜头组合棱镜。你可以做的是用一个设置器组合一个设置器,prism
和lens
实际上都是多态类型,包括ASetter
作为一个专业。
{-# LANGUAGE MonadComprehensions #-}
example1 v = [ x | A x <- pure v ] >>= mbMult3