我有这个任务,我必须处理一个错误,但有一些限制,我不能使用例外和选项。所以我假设我有以下代码:
let tryWithIndex arr i =
if ((Array.length arr)-1 > i) then
arr.[i]
else
???
我的问题是我不知道如何指定" null"在else语句中有一些值,另一件事是它必须是一个' a []输入,所以例如如果它是一个int []我只能返回-99999,就像这是一个非常糟糕的主意,因为这个赋值是愚蠢的,但这就是我正在寻找的那种原始解决方案,只是以通用的方式。
所以我的问题是,我如何返回"默认"类型' a ??
的值答案 0 :(得分:3)
执行此操作的正常功能方法是返回一个Maybe,它在F#中称为option
。如果你不能使用内置的option
,你可以定义自己的Maybe,这是等价的:
type Maybe<'a> = Just of 'a | Nothing
这可能是作弊,但您也可以使用由
定义的Eithertype 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