Mogę użyć operatora scalaz
|>
, gdy chcę zmienić funkcję i obiekt, aby uzyskać nieco większą czytelność. Pozwól, że przedstawię ci funkcję modelu: Funkcja przełącznika i obiekt z scalazem | |>
def length2(x:String) = x.length * 2
Teraz mogę napisać to na dwa sposoby:
"aoeu" |> length2
length2("aoeu")
Ale jeśli zdefiniuję tę funkcję jako bardziej ogólną, przestanie działać.
def length2(x:SeqLike[_
,_
]) = x.length * 2
length2("aoeu") // ok
"aoeu" |> length2 // doesn't work
Dlaczego kompilator tego nie rozumie? Istnieje pewna niejawna konwersja z
String
na niektóre klasy mieszające w cechach
SeqLike
.
Tricky. Na początku myślałem, że to dlatego, że możesz mieć tylko jedno niejawne w tym samym czasie, ale teraz wydaje się, że może jest to również problem wariancji ukryty gdzieś ... – Debilski
@Debilski, nie jestem pewien gdzie '|>' jest zdefiniowany w skalazie, ale kiedy Próbowałem zdefiniować własną, myślę, że "tylko jedna niejawna reguła" uniemożliwiła jej zastosowanie: "aoeu" musiałaby zostać niejawnie przekonwertowana na klasę za pomocą metody "|>", a następnie ponownie na "SeqLike". – huynhjl
Wyświetl komunikat o błędzie. Nie wszyscy mają Scalaza łatwo dostępne, ale komunikaty o błędach zwykle wyjaśniają, co się dzieje. –