2016-12-17 73 views
3

假設你想創建一個具有最終副作用(引發錯誤,退出程序,飛向月球)的函數,那麼遵循的正確模式是什麼?我現在做的是這樣的:當您不關心返回值時,創建適應性泛型返回類型的首選方法是什麼?

let fastExit x = 
    match box x with 
    | null -> 
     System.Environment.FailFast("Something went terribly wrong, get out fast!") 
     Unchecked.defaultof<_> // adaptable generic return 
    | _ -> x 

我按照上面的圖案很經常(尤指與CLR的BCL互動。),但從來沒有真正想知道它是否是做事的F#方式。顯然,這隻適用於你永遠不會返回的情況,或者如果你不必在追求代碼時關心危險的返回值。

請注意,作爲(現已刪除的)註釋建議,這在合成和連鎖性方面也是有意義的(即,組成>>和管道|>操作員)。

+4

我可能只是把failwith讓編譯器開心 –

+1

@JohnPalmer,你的意思是在需要執行任何代碼之後(即在這個例子中的'FailFast'之後)放置'failwith'。這在某些你不想退出的情況下不起作用(儘管承認這是危險的代碼)。 – Abel

+0

這可能是我會做的 –

回答

2

我會寫這樣的事:

let fastExit x = 
    if isNull x then nullArg "x" 
    elif otherGenericCheck x then failwith "x Didn't pass other generic check" 
    // More generic checks 
    x 

注意,編譯器已經限制有null作爲值的x類型。

如果您將其包含在內,您將檢查任何類型,包括那些在內部使用null作爲「有效」值的表示,這意味着如果您傳遞選項類型且其值爲None,則它將失敗。

因此,拳擊或不取決於。

當然,如果唯一的檢查是空檢查,我根本不會寫這個函數,我想我們都同意,除非有這種情況,你想要有效果,例如鏈接許多功能與|>

+0

感謝評論拳擊,但如果我添加'isNull',肯定有它的用途,那麼我就失去了通用性(正如你在答案中提到的那樣)。此外,我有不同簽名的情況(即「a」,「b」或「單元」,「a」或其他)。但是我認爲你總體上是正確的,因爲如果你不希望能夠達到那個程序點,那麼最好從'failwith'函數返回。 – Abel

+0

對不起,我沒有得到你所說的關於像''unit - >'a''這樣的不同簽名。你能解釋一下嗎? – Gustavo

+0

我用'unit - >'a'表示的是,例如'exit()'這樣的函數,它以退出代碼退出。或者從[另一個問題](http://stackoverflow.com/questions/41193629),['(ExceptionDispatchInfo.Capture ex).Throw()'](https://msdn.microsoft.com/en-us /library/system.runtime.exceptionservices.exceptiondispatchinfo.throw(v=vs.110).aspx)方法,它是'unit - > unit',但是包含的函數應該有'unit - >'a',類似於'reraise()'函數。 – Abel

2

你可以重寫你的例子如:

let fastExit x = 
    if box x = null then // not the most efficient to way to check for null, but whatever 
     System.Environment.FailFast("Oh noes!") 
    x 

這也適用,如果你要求它會拋出異常的功能。不知道飛到月球的功能,但...

這將是一般的方法:你正在寫命令式的代碼,所以寫一個命令式的方式。

+0

是的,這是寫這個例子的另一種方式(可以說是一種更好的方法,但我經常發現自己避免了「if-then」,必須是我的聲明性編程背景)。但我的意思是我的問題是更通用的,例如,我也有簽名'unit - >'a',在那裏我用'Unchecked.defaultOf <_>'執行''a'。 – Abel

+2

那麼,一般來說,我建議以這種方式編寫代碼,使其不返回代碼路徑,而不是返回一個無意義或潛在危險的值(如null),以取悅編譯器。 F#爲您提供了編寫命令式代碼的工具,因此如果您正在編寫命令式邏輯,請利用它們。 – Asik

相關問題