Error handling 如何显示OK结果

Error handling 如何显示OK结果,error-handling,elm,maybe,Error Handling,Elm,Maybe,我正在玩Elm示例,我注意到该示例给出了结果类型。陷入困境后,我想出了一个简化的例子: import Html exposing (text) import String f: Int -> Int f x = x + 1 g: Result String Int -> Result String Int g x = (Result.map f) x main = text ( toString ( g (String.toInt 5 ) )) 结果显示的是OK 6,

我正在玩Elm示例,我注意到该示例给出了
结果
类型。陷入困境后,我想出了一个简化的例子:

import Html exposing (text)
import String

f: Int -> Int
f x = x + 1

g: Result String Int -> Result String Int
g x = (Result.map f) x

main =
  text (  toString ( g  (String.toInt 5 ) ))
结果显示的是
OK 6
,我希望它只显示
6
——我知道
toString
接受任何类型并返回它的字符串表示。所以我可以修改
toString

  • 如果结果是
    OK
    ,则我可以打印数值结果
  • 如果结果是
    Err
    ,那么我想执行一些自定义错误消息
这可能是故障的原因,因为
+1
操作可能会失败

andThen : Result e a -> (a -> Result e b) -> Result e b
andThen result callback =
    case result of
      Ok value -> callback value
      Err msg -> Err msg
的定义正是它所做的。。。这是一个例子


使用
或普通的
案例
如何修复我的示例?即使我自己修复它,它也可能不是具有良好错误处理能力的最像Elm的解决方案。因此,我要发布这个问题。

当函数返回结果时,您有一个选择-您也可以返回一个结果,在这种情况下,您可以返回Err(某物)或Ok(某物)。这会将错误过滤到调用函数,该函数可以决定执行什么操作。另一种方法是,您可以返回非结果的内容,如字符串或Html。如果使用第二种方法,则需要处理结果的两种可能性,仍然返回字符串或Html

例如,这个函数接受一个结果并返回一个字符串。它处理这两种可能性,返回一个字符串,即使结果是错误

foo: Result String Err -> String
foo myres = 
  case myres of 
    Ok(str) -> str
    Err(e) -> "there was an error! uh oh"
这是一个问题,你想把你的结果提升到多高的层次。你想让错误一直渗透到顶层吗?也许您的顶级功能如下所示:

View: Model -> Html
View model = 
  case makeMyHtml(model) of 
    Ok(htm) -> htm
    Err(e) -> renderSpecialErrorHtmlPage(e)
无论如何,在这种情况下,要去掉“Ok”,您可以执行以下操作:

main =
  let res = g  (String.toInt 5 ) 
  text (  toString ( Result.withDefault "g returned an error!" res)) 
如果g返回Ok(6),则得到“6”,但如果它返回error,则得到“g返回了一个错误!”