Su análisis, que tipo de sistema de Scala rechazará String como no ser un "tipo superior kinded" * -> * es correcto. Es decir, el tipo String no se puede ceder a F[_]
para cualquier F. Se podría tratar (No he comprobado esto) conversiones implícitas ...
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], FA_Is_That: F[A] <%< That)
... pero esto no será tan útil me sospechoso porque tendrías que proporcionar tus propias conversiones personalizadas cuando sea necesario pero también porque el rendimiento sería terrible, suponiendo que esta sea una parte candente del código.
O, usando la biblioteca estándar, se puede utilizar la maquinaria CanBuildFrom
pero está lejos de ser evidente cómo bien esto va a mezclar con las clases de tipos de estilo scalaz.
def foo[A, F[_], That](implicit mon: Monoid[F[A]], pr: Pure[F], b: CanBuildFrom[A, F[A], That]): That
En el cuerpo del método, por supuesto, usted tendrá que utilizar el constructor para construir el valor de retorno, en contraposición a las clases de tipos monoid/puro, haciéndolos algo redundante, sospecho.
¿Por qué necesita Monoid [F [A]] en lugar de solo Monoid [F]? – CheatEx
@CheatEx, en este caso, yo no soy el que escribió 'foo', solo soy el que llama. – huynhjl