2017-10-16 60 views
2

考慮以下幾點:與構造提供的實施一般會員

type Foo(bar:'a -> 'a list) = 
    member __.Bar = bar 

我得到一個警告在參數列表中的第一個'a說:

這種結構導致代碼是小於通用由類型註釋表示。類型變量'a被約束爲類型'obj'。

爲什麼我會收到此警告?

在這個特定的例子中,是否有一個成員可以將任意類型的值轉換爲這種類型的列表並讓該成員通過構造函數提供? (有人可能會如想象Foo被實例化List.replicate x爲該用戶選擇任意整數x。)

我不想讓自己Foo通用的,因爲我有很多這樣的參數和成員。

(我想這個的原因是我想要的某種結構的,除其他事項外,包含用戶覆蓋的通用功能。)

回答

3

即使你做Foo通用的,你不需要調用它的時候,如果他們可以推斷,明確規定了通用的參數:

type Foo<'a>(bar:'a -> 'a list) = 
    member __.Bar = bar 

Foo(fun x -> [x + 1]) 

我不知道如果這能幫助你,但在一般"Functions lose genericity when passed as values"

+0

謝謝,鏈接幫助。我不知道那件事。 – cmeeren