Twoja analiza, że układ typu Scala odrzuci String jak nie bycie "wyższy typ kinded" * -> * jest poprawne. Oznacza to, że typ String nie jest przypisane do F[_]
dla każdego F. Można spróbować (nie sprawdziłem tego) niejawne konwersje ...
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], FA_Is_That: F[A] <%< That)
... ale to nie będzie to przydatne I podejrzany, ponieważ w razie potrzeby musisz podać własne konwersje, ale także dlatego, że wydajność byłaby straszna, zakładając, że jest to gorąca część kodu.
Albo, używając standardowej biblioteki, można użyć maszyny CanBuildFrom
ale to jest dalekie od oczywistości jak ładnie będzie mieszać się z typeclasses scalaz stylu.
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], b: CanBuildFrom[A, F[A], That]): That
W ciele metody, oczywiście, trzeba będzie użyć konstruktora do skonstruowania wartości zwracanej, w przeciwieństwie do monoid/pure typeclasses, czyniąc je nieco zbędny, podejrzewam.
Dlaczego potrzebujesz Monoid [F [A]] zamiast tylko Monoid [F]? – CheatEx
@CheatEx, w tym przypadku, nie jestem tym, który napisał 'foo', jestem tylko dzwoniącym. – huynhjl