Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如果模式匹配结果为'maybea'_Haskell_Haskell Lens - Fatal编程技术网

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
是否有其他方法可以执行ifA
ifB
ifC

编辑:

  • 我怀疑
    lens
    library可能有什么东西。但是我现在对镜头一无所知
  • 更新的国际金融公司
    ifC
  • †从该包装型号。您可以使用为您的类型生成棱柱,然后使用(或其等效前缀)访问sum类型的成员,如果提供了不同的值,则生成
    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