F# 无法使用异常(failwith、try finally、raise等)或选项时的错误处理

F# 无法使用异常(failwith、try finally、raise等)或选项时的错误处理,f#,F#,我有这个任务,我必须处理一个错误,但有一些限制,我不能使用异常和选项。假设我有以下代码: let tryWithIndex arr i = if ((Array.length arr)-1 > i) then arr.[i] else ??? 我的问题是我不知道如何在else语句中指定一个“null”类型的值,另一件事是它必须是一个'a[]输入,例如,如果它是int[],我只能返回-99999,就像这是一个非常糟糕的主意,因为这个赋值很愚蠢

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

let tryWithIndex arr i =
    if ((Array.length arr)-1 > i) then
        arr.[i]
    else
        ???
我的问题是我不知道如何在else语句中指定一个“null”类型的值,另一件事是它必须是一个'a[]输入,例如,如果它是int[],我只能返回-99999,就像这是一个非常糟糕的主意,因为这个赋值很愚蠢,但这是我正在寻找的原始解决方案,只是以一般的方式


因此,我的问题是,如何返回类型为“a”的“默认”值???

正常的功能方法是返回a Maybe,在F#中称为
选项。如果无法使用内置的
选项
,您可以定义自己的Maybe,这相当于:

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

键入Maybe int->other执行此操作的正常功能方式是返回一个Maybe,在F#中称为
选项。如果无法使用内置的
选项
,您可以定义自己的Maybe,这相当于:

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

键入Maybe int->or第一件事是首先询问“我不能使用选项”。
但让我们假装是这样。为了更好地处理这个问题,可以通过回调

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

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

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

是的,我喜欢你的建议。我的方法只需要返回“a”,因此它也不能返回我自己的。但是你提出的实施一个选项的建议是你自己的,并且回答了我的问题,所以我会接受你的回答:)。我确实使用了未经检查的默认值。是的,我喜欢你的建议。我的方法只需要返回“a”,因此它也不能返回我自己的。但是你提出的实施一个选项的建议是你自己的,并且回答了我的问题,所以我会接受你的回答:)。我确实使用了Unchecked.defaultof