2011-01-07 64 views
3

我有一個簡單的問題。爲什麼這不起作用?使用F的類型成員中的元組#

type Test1() = 
    member o.toTuple = 1.,2.,3. 

type Test2() = 
    member o.test (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = o.test x.toTuple 

的錯誤是:

類型約束不匹配。 float類型*浮子*浮子不與鍵入Test1類型 '浮子*浮子*浮動' 兼容不與類型 '測試1'

類型「浮子*浮子兼容* float'與類型'Test1'不兼容

回答

5

這不起作用,因爲第一個成員測試在超載情況下被視爲多參數方法。 如果你需要一個tupled一個,你必須添加額外的括號:

type Test2() = 
    member o.test ((x: float, y: float, z: float)) = printfn "test" 
    member o.test (x: Test1) = o.test x.toTuple 

唐賽姆here的見的解釋。

請注意,如果你不想增加額外的括號,你仍然可以解構的元組,並使用多個參數調用:

type Test2() = 
    member o.test (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = let a,b,c = x.toTuple in o.test(a,b,c) 
+0

感謝解釋 – 2011-01-07 13:46:08

4

將您的第一個方法重命名爲Type2而不是test。你的第二種方法是遮蔽你的第一個方法,從而混淆了編譯器。

type Test1() = 
    member o.toTuple = 1.,2.,3. 

type Test2() = 
    member o.print (x: float, y: float, z: float) = printfn "test" 
    member o.test (x: Test1) = o.print x.toTuple