我正在编写很多代码,如下所示:
popStack groupTail
|> andThen
(( parentGroup, parentTail ) ->
addChild currentGroup sibling
|> andThen
(updatedParent ->
case sibling of
SingleExercise _ ->
workHelp siblingIndent (updatedParent :: parentTail)
WorkGroup _ _ ->
workHelp siblingIndent (sibling :: (updatedParent :: parentTail))
)
)
感觉很像所有嵌套andThen
调用的回调地狱,我想知道是否有习惯性的方法可以使用不同类型的函数应用程序来避免所有嵌套。
@Reactormonk提供了一个有用的链接,但Elm
不是Haskell
。否则,我们可以使用do-notation
提供的Maybe monad
和句法糖。像这样:
do
(parentGroup, parentTail) <- popStack groupTail
updatedParent <- addChild currentGroup sibling
case sibling of
SingleExercise _ ->
workHelp siblingIndent (updatedParent : parentTail)
WorkGroup _ _ ->
workHelp siblingIndent (sibling : (updatedParent : parentTail))
但在Elm
中,我最终会将逻辑移动到单独的函数中:
let
workHelpToSibling sibling ( parentTail, updatedParent ) =
case sibling of
SingleExercise ->
workHelp siblingIndent (updatedParent :: parentTail)
WorkGroup ->
workHelp siblingIndent (sibling :: (updatedParent :: parentTail))
addChildTo currentGroup sibling ( parentGroup, parentTail ) =
addChild currentGroup sibling
|> Maybe.map (updatedParent -> ( parentTail, updatedParent ))
in
popStack groupTail
|> andThen (addChildTo currentGroup sibling)
|> andThen (workHelpToSibling sibling)
由于您可以在更高级别访问currentGroup
和sibling
,因此可以通过降低函数的 arity(而不仅仅是通过此(来重构此代码。
我只是想指出最小化缩进级别的想法,这确实让人想起回调地狱。