Esta es una pregunta de seguimiento al this one. Creo que malentendí un poco qué tipo se debe hacer en Haskell, así que aquí está, con suerte, una mejor formulación de la pregunta:Escriba una función genérica con exactamente dos variaciones de tipos de parámetros
Quiero tener una función que se pueda invocar con exactamente dos argumentos. Estos argumentos deben ser de diferentes tipos. Por ejemplo, uno es cadena, y otro es un número entero.
considerar esta aplicación:
combine "100" 500 -- results in 100500
combine 100 "500" -- results in 100500
combine 100 500 -- raises an exception
combine "100" "500" -- raises an exception
No es un problema para escribir una aplicación concreta, se trata de un problema, sin embargo, para mí, para dar a esta función de una firma apropiada.
También me interesaría saber si existe una solución que sea más genérica (es decir, no requiera especificar los tipos concretos, sino que solo prescriba que los tipos sean diferentes. De modo que, por ejemplo, podría utilizar esta función para "fijar" la entrada a otras funciones, si se puede solucionar mediante la permutación de los argumentos
Gracias
EDIT:.!
a continuación es una copia imprecisa de lo que estaba esperando Que hacer en Erlang ... bueno, espero que tenga sentido, ya que debería ser bastante similar ...
combine([String], Int)->
io:fwrite("~s~w~n", [[String], Int]);
combine(Int, [String])->
combine([String], Int).
Ya que es un problema con los tipos, que no quiere "lanzar una excepción", que querría un error en tiempo de compilación. La diferencia puede sonar pedante, pero es importante. En Haskell, siempre queremos errores en tiempo de compilación si es posible.Además, parece que estás pensando en Python en lugar de Haskell: P –
Diría que la forma correcta de hacerlo es escribir: 'combine :: Integer -> String -> String'. Eso garantiza que tomará exactamente un argumento de cada tipo. Es simple, está claro. No implica ninguna característica avanzada. ¿Qué más podrías pedir? – Carl
Yo personalmente recomendaría simplemente hacer dos funciones: 'combineStrInt :: String -> Int -> Int' y' combineIntStr :: Int -> String -> Int'. Yo * recomendaría * solo una función, y luego usar 'flip' para invertir el orden de los argumentos cuando sea necesario, pero para su ejemplo, simplemente voltear los parámetros no produciría el resultado correcto. En la práctica, probablemente encontrarás 'flip' útil. –