2016-11-11 52 views
1

在電源查詢(M),我發現2種方式來聲明類型:myVar as typetype text電源查詢類型定義

每一個似乎適用於不同的上下文。例如:

Table.AddColumn(myTable, "NewName", each [aColumn], type text) 

MyFunc = (aParam as any) as date => Date.From(aParam) 

然而,這並不像我期待更復雜的工種,像{text}{number},這將是唯一的文本值或僅號碼列表。我可以使用這些類型的語法爲type,但不能使用as type語法。

爲什麼?

此外,在M中聲明類型是否有任何性能影響,或者只是在傳遞/返回不正確的類型時引發錯誤?

回答

2

在「M」中聲明類型通常應該對性能影響很小,並且會使您的函數更「自我記錄」。

當調用一個函數時,會檢查函數參數類型「kind」,而不是定製的完整類型定義。因此,將數字列表傳遞給期望列表文本的函數不會導致任何錯誤。你可以看到一些「M」:

let 
    FunctionType = type function (l as { text }) as any, 
    UntypedFunction = (l) => l{0}, 
    TypedFunction = Value.ReplaceType(UntypedFunction, FunctionType), 
    Invoked = TypedFunction({0, 1, 2}) 
in 
    Invoked 

如果不檢查遞歸類型是很好的表現,因爲檢查列表中的每個元素將需要通過整個列表循環。

當您編寫一個函數值如(l) => l{0}時,您只能使用基本類型,如as list而不是as { text }。我認爲這個限制旨在指導函數作者不要將類型限制放在函數不會承認的地方。

您可以在Language Specification中閱讀更多關於語法允許的內容。 (如果鏈接死亡,您應該可以從MDSN開始關注PDF鏈接。)