gpt4 book ai didi

haskell - 如果模式与 `Maybe a` 匹配结果

转载 作者:行者123 更新时间:2023-12-02 14:26:28 25 4
gpt4 key购买 nike

以下代码说明了我的意图。我想要模式匹配,如果没有结果是 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吗?

编辑:

  1. 我怀疑 lens 库可能有东西。但目前我对 lens 一无所知。
  2. 更新了 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 ()

棱镜的好处在于它们可以与其他光学器件组合(例如 lensesfoldstraversals ),并使用它们通过组合棱镜来遍历嵌套和类型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com