Czy ktoś może wyjaśnić, dlaczego drugi przykład poniżej nie zostanie skompilowany?Dlaczego "Kodeks nie jest wystarczająco ogólny"?
"Test 2" daje "błąd FS0670: Ten kod nie jest wystarczająco ogólny, zmienna typu^a nie może zostać uogólniona, ponieważ wymknie się jej zakresowi.". Nie rozumiem tego komunikatu o błędzie.
// Test 1
type test1<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> a.ToString()
// Test 2
type test2<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string a
// Test 3
type test3<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string (a :> obj)
'string' [jest w rzeczywistości' 'T -> string'] (http://msdn.microsoft.com/en-gb/library/ee340491.aspx), więc powinno to działać w teorii. Nie mam jednak lepszego wyjaśnienia błędu. –
O tak, po prostu utknąłem string ;; w F # interaktywny, aby uzyskać typ. Prawdopodobnie użycie ciągu znaków zmusza kompilację do wymuszenia typu na danych wejściowych, a wybór obiektu jest najniższym wspólnym mianownikiem? – Massif