什么是处理(深层嵌套)仿函数的正确方法?

rob*_*kuz 5 haskell functor purescript

我有以下简单的代码

import Data.String.Regex
import Data.Array

last <$> match someRegex "   1"
Run Code Online (Sandbox Code Playgroud)

哪里

match someRegex "   1"
Run Code Online (Sandbox Code Playgroud)

返回类似的东西

Just ([Just ("   1"),Just ("   "),Just ("1")])
Run Code Online (Sandbox Code Playgroud)

last <$> match someRegex "   1"
Run Code Online (Sandbox Code Playgroud)

返回类似的东西

Just (Just (Just ("   1"))) 
Run Code Online (Sandbox Code Playgroud)

现在我有一个深深嵌套的Maybe.这使得它很难处理(甚至使用仿函数).我给自己写了一对辅助函数 - 但我对此并不满意.它不知何故感觉不对.

extract j = do
    case j of
        Nothing -> Nothing
        Just a -> a
extract2 jj = extract $ extract jj
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

extract2 $ last <$> match someRegex "   1"
Run Code Online (Sandbox Code Playgroud)

在Purescript/Haskell中有没有更好/惯用的方法来做这些事情?

Phi*_*man 11

也许你正在寻找这个join功能:

http://pursuit.purescript.org/packages/purescript-control/0.3.0/docs/Control.Bind#d:join

join将结构的两个层折叠到单个图层,组合任何效果.在这种情况下Maybe,这意味着结果值Nothing不仅仅是两个图层都不是Nothing.

  • 一种方法是注意`join(map fx)`与'mon >>同义的`x >> = f`相同,所以你可以说`match someRegex"1">> = last`并保存自己`join`. (3认同)