当我无法使用异常(failwith,try-finally,raise etc.)或Options时,错误处理

时间:2016-10-30 12:13:47

标签: f#

我有这个任务,我必须处理一个错误,但有一些限制,我不能使用例外和选项。所以我假设我有以下代码:

let tryWithIndex arr i =
    if ((Array.length arr)-1 > i) then
        arr.[i]
    else
        ???

我的问题是我不知道如何指定" null"在else语句中有一些值,另一件事是它必须是一个' a []输入,所以例如如果它是一个int []我只能返回-99999,就像这是一个非常糟糕的主意,因为这个赋值是愚蠢的,但这就是我正在寻找的那种原始解决方案,只是以通用的方式。

所以我的问题是,我如何返回"默认"类型' a ??

的值

2 个答案:

答案 0 :(得分:3)

执行此操作的正常功能方法是返回一个Maybe,它在F#中称为option。如果你不能使用内置的option,你可以定义自己的Maybe,这是等价的:

type Maybe<'a> = Just of 'a | Nothing

这可能是作弊,但您也可以使用由

定义的Either
type Either<'a, 'b> = Left of 'a | Right of 'b

尝试编写函数,使其具有类型

'a [] -> int -> Either<string,'a>

由于这是一项任务,我将剩下的作为练习:)

答案 1 :(得分:3)

首先要问的是“我不能使用选项” 但是我们假装是这样的。为了有更好的方法来处理,可以通过回调。

let tryWithIndex (callback: Unit -> 'T) (arr: [] 'T) i =
    if ((Array.length arr)-1 > i) then
        arr.[i]
    else
        callback()

在您的通话网站上,您可以

let intArr : [] = ...
let r = tryWithIndex (fun () -> -9999) intArr 66