处理(深度嵌套的)仿函数的正确方法是什么?
Whats the right way to handle (deeply nested) functors?
我有以下简单代码
import Data.String.Regex
import Data.Array
last <$> match someRegex " 1"
其中
match someRegex " 1"
returns 类似于
Just ([Just (" 1"),Just (" "),Just ("1")])
和
last <$> match someRegex " 1"
returns 类似于
Just (Just (Just (" 1")))
现在我有一个深度嵌套的 Maybe。这使得它很难使用(即使使用仿函数)。
我已经为自己编写了一对辅助函数——但我对此有点不满意。感觉有点不对。
extract j = do
case j of
Nothing -> Nothing
Just a -> a
extract2 jj = extract $ extract jj
然后像这样使用它
extract2 $ last <$> match someRegex " 1"
在 Purescript/Haskell 中是否有 better/idiomatic 方法来做这些事情?
也许您正在寻找 join
函数:
http://pursuit.purescript.org/packages/purescript-control/0.3.0/docs/Control.Bind#d:join
join
将结构的两层折叠为单层,组合任何效果。在 Maybe
的情况下,这意味着只有当两个层都不是 Nothing
.
时,结果值才不会是 Nothing
我有以下简单代码
import Data.String.Regex
import Data.Array
last <$> match someRegex " 1"
其中
match someRegex " 1"
returns 类似于
Just ([Just (" 1"),Just (" "),Just ("1")])
和
last <$> match someRegex " 1"
returns 类似于
Just (Just (Just (" 1")))
现在我有一个深度嵌套的 Maybe。这使得它很难使用(即使使用仿函数)。 我已经为自己编写了一对辅助函数——但我对此有点不满意。感觉有点不对。
extract j = do
case j of
Nothing -> Nothing
Just a -> a
extract2 jj = extract $ extract jj
然后像这样使用它
extract2 $ last <$> match someRegex " 1"
在 Purescript/Haskell 中是否有 better/idiomatic 方法来做这些事情?
也许您正在寻找 join
函数:
http://pursuit.purescript.org/packages/purescript-control/0.3.0/docs/Control.Bind#d:join
join
将结构的两层折叠为单层,组合任何效果。在 Maybe
的情况下,这意味着只有当两个层都不是 Nothing
.
Nothing