【发布时间】:2019-08-30 18:15:26
【问题描述】:
这个问题是一个更大问题的子问题,这是最后一个难题:
我有两个功能:
getUserFromDB :: Token -> Either String User
getNewUser :: Token -> Either String User
如何将它们结合起来得到这样的功能:
getUser :: Token -> Either String User
以便getUserFromDB 和getNewUser 依次尝试,输入相同的输入(Token 是 OAuth api 的 api 令牌)并返回第一个成功函数的结果,或者一些如果没有成功则默认值?
换句话说:如果 FP 中有一个函数,其签名如下:
tryUntilGoodOrFail :: failValue -> (result -> Boolean) -> [fn] -> input -> result
OR
tryUntilGoodOrFail :: a -> (a -> Boolean) -> [(b -> a)] -> b -> a
编辑
这只是一个关于函数式编程的新手问题。我只是不知道如何将两个(或更多)函数并行排列,这与连续函数管道(FP 非常擅长)相反。但在现实世界的情况下,这种并行序列函数模式是经常需要的。我相信 FP 对此有自己的解决方案。我只是在任何地方都找不到它。
【问题讨论】:
-
为什么这个标签是“理论”?这听起来很像一个特定的 Haskell 问题。
-
它与语言无关,通常与 FP 有关。
-
我使用 Scala,但听起来这可以使用模式匹配轻松完成。 Scala 中的最终错误类型将被编写为两种错误类型的超类。我不知道如何在 Haskell 中编写它。
-
@StasShepelev 在 Haskell 中,
Either是Semigroup的一个实例,并且有一个default value function,所以你只需写fromRight failValue $ getUserFromDB token <> getNewUser token -
@StasShepelev 对于更通用的版本,您也可以使用
let (Right result) = sconcat $ map ($ token) [getUserFromDB, getNewUser] |: Right failvalue
标签: functional-programming theory