En algunos lenguajes, medios sobrecarga usando el mismo nombre para varias funciones que proporcionan una funcionalidad similar pero diferente, por lo que podría tratar
split :: String -> [String] -- splits on whitespace
split :: Char -> String -> [String] -- splits on the given character
split :: [Char] -> String -> [String] -- splits on any of the given characters
split :: (Char -> Bool) -> String -> [String] -- splits using a function that tells you when
que le daría el error Duplicate type signature
que está recibiendo.
Haskell no hace este tipo de sobrecarga, y un programador Haskell daría a estos diferentes nombres:
words :: String -> [String] -- splits on whitespace
splitOn :: Char -> String -> [String] -- splits on the given character
splitsOn :: [Char] -> String -> [String] -- splits on any of the given characters
splitWith :: (Char -> Bool) -> String -> [String] -- splits using a function that tells you when
La razón de que Haskell no permite el tipo de sobrecarga que creo que estás preguntando por , es que realmente no te permite hacer nada que no podrías hacer sin él, y permitirlo haría casi imposible hacer tipos más avanzados de sobrecarga. La sobrecarga de Haskell es una herramienta muy poderosa; averigüe sobre las clases de tipos y las clases de constructores para comenzar.
En realidad, ya String
= programadores [Char]
, y Haskell aman la reutilización de código, que serían mucho más propensos a escribir:
words :: String -> [String] -- splits on whitespace
splitOn :: Eq a => a -> [a] -> [[a]] -- splits on the given item
splitsOn :: Eq a => [a] -> [a] -> [[a]] -- splits on any of the given items
splitWith :: (a -> Bool) -> [a] -> [[a]] -- splits using a function that tells you when
Aquí Eq a
es un ejemplo de un tipo de sobrecarga Haskell sí permite, en donde splitOn
le permitirá dividir cualquier lista, siempre y cuando los elementos se puedan comparar por igualdad (es decir, Haskell le permite definir su propia noción de igualdad). Puede usar esto para dividir una cadena o, por ejemplo, una lista de cadenas, pero no puede dividir una lista de funciones porque no puede verificar dos funciones para ver si son iguales. splitWith
es un ejemplo de Haskell que le permite tratar una función como la mayoría de los demás datos: ¡puede pasar una como argumento!
[Nota 1: words
es una función estándar, splitWith
está en una biblioteca con una typesignature ligeramente diferente.]
[Nota 2: si desea escribir en realidad estas funciones, se hace así:
splitWith isSplitter list = case dropWhile isSplitter list of
[] -> []
thisbit -> firstchunk : splitWith isSplitter therest
where (firstchunk, therest) = break isSplitter thisbit
-- words = splitWith isSpace -- not needed, standard function from the Prelude
splitOn c = splitWith (== c) -- notice I passed == in an argument!
splitsOn chars = splitWith (`elem` chars)
]
@Zach: La sobrecarga de hecho se considera una forma de polimorfismo. Ver: [Polimorfismo Ad-hoc] (http://en.wikipedia.org/wiki/Ad-hoc_polymorphism) en Wikipedia. No estoy seguro de a qué se refiere en la segunda parte de su pregunta. ¿Podrías aclararlo por favor? – hammar
Intento usar la 'clase Barable'. suponiendo que tenemos una variable 'x' igual al Entero' 5'. pero 'bar x' no funcionó. y también en caso de trabajo, ¿qué devolverá '8' o' falso'? es un ejemplo ambiguo. – Jaider
@Jaider: el tipo generalmente se deducirá del contexto donde se usa, aunque puede forzarlo con una anotación de tipo. Pruebe 'bar 5 :: Int' o' bar 5 :: Bool'. – hammar