2009-12-14 90 views
8

我想了解這兩個編程概念之間的區別。第一個代表沒有數據類型,後者代表類型存在,但沒有信息。此外,我認識到單元來自函數式編程理論基礎,但我仍然不明白單元基元的可用性(例如,在F#程序中)。無效與單元

回答

11

單位類型只是使一切更規則。在某種程度上,您可以將F#中的每個函數都考慮爲獲取單個參數並返回單個結果。不需要任何參數的函數實際上將「unit」作爲參數,並且不返回任何結果的函數返回「unit」作爲結果。這具有多種優點;例如,考慮在C#中,您需要一組「Func」委託來表示各種返回值的元素的函數,以及一些不返回值的「操作」委託(因爲例如Func<int,void>不合法 - void不能以這種方式使用,因爲它不是真正的類型)。

另請參見F# function types: fun with tuples and currying

+0

嗯解釋+1 – Dario 2009-12-14 13:50:54

+0

And()只是n元組元組的邏輯結尾,0元元組! – Dario 2009-12-14 13:55:50

+0

謝謝!標記。 – 2009-12-14 14:12:52

8

在函數式編程中,我們通常會將輸入映射到輸出。這實際上意味着將參數映射到其返回值。但是如果在數學/範疇理論意義上某種東西是功能的話,它必須返回。 A void值表示函數不返回任何內容,這在這些術語中是無意義的。

unitvoid的功能答案。它基本上只有一個值,()。它有很多用途,但這裏有一個簡單的用法。比方說,你在一個更傳統的命令式語言有這樣的事情:

public static <T, U> List<U> map(List<T> in, Function<T, U> func) { 
    List<U> out = new ArrayList<U>(in.size()); 
    for (T t : in) { 
    out.add(func.apply(t)); 
    } 
    return out; 
} 

這適用於特定的功能func到名單上的每一個元素,生產func的輸出類型的新名單。 但是如果你傳遞一個只打印它的參數的函數會發生什麼?它不會有輸出類型,那麼您可以爲U投入什麼?

在某些語言中,傳遞這樣的函數會破壞此代碼(就像在C#中一樣,您不能將void指定爲泛型類型)。你不得不採取像Action<T>這樣的解決方法,它會變得笨重。

這是的unit概念是很有用的:一個類型,而是一個可能只需要在一個單一的值。這大大簡化了鏈接和組合等事情,大大減少了您不必擔心的特殊情況。

+0

也對此答案+1。你的片段非常徹底。謝謝! – 2009-12-14 14:11:51