Questa è una domanda successiva a this one. Penso di aver frainteso un po 'che tipo di didascalia ha intenzione di fare in Haskell, quindi ecco, si spera, una migliore formulazione della domanda:Scrivere una funzione generica con esattamente due varianti di tipi di parametri
Voglio avere una funzione che può essere chiamata con esattamente due argomenti. Questi argomenti devono essere di tipi diversi. Ad esempio, uno è una stringa e un altro è un numero intero.
Considerate questa applicazione:
combine "100" 500 -- results in 100500
combine 100 "500" -- results in 100500
combine 100 500 -- raises an exception
combine "100" "500" -- raises an exception
Non è un problema di scrivere una concreta attuazione, si tratta di un problema, tuttavia, per me, per dare questa funzione una firma corretta.
Sarei anche interessato a sapere se esiste una soluzione più generica (ovvero non è necessario specificare i tipi concreti, ma solo i tipi per essere diversi. In modo che, ad esempio, si possa utilizzare questa funzione per "fissare" l'ingresso ad altre funzioni, se può essere fissato permutando gli argomenti
Grazie
EDIT:.!
di seguito è una copia imprecisa di quello che mi aspettavo da fare in Erlang ... beh, spero che abbia senso, visto che dovrebbe essere abbastanza simile ...
combine([String], Int)->
io:fwrite("~s~w~n", [[String], Int]);
combine(Int, [String])->
combine([String], Int).
Poiché si tratta di un problema con i tipi, che non vorresti a "sollevare un'eccezione", che ci si vuole un errore di compilazione. La differenza può sembrare pedante, ma è importante. In Haskell, vogliamo sempre gli errori in fase di compilazione, se possibile.Inoltre, sembra che tu stia pensando in Python invece di Haskell: P –
Direi che il modo giusto per farlo è scrivere: 'combine :: Integer -> String -> String'. Ciò garantisce che prenderà esattamente un argomento di ciascun tipo. È semplice, è chiaro. Non comporta alcuna funzionalità avanzata. Cosa si potrebbe chiedere di più? – Carl
Personalmente raccomanderei semplicemente di fare due funzioni: 'combineStrInt :: String -> Int -> Int' e' combineIntStr :: Int -> String -> Int'. Io * vorrei * raccomandare solo una funzione, e poi usare 'flip' per invertire l'ordine degli argomenti quando necessario, ma per il tuo esempio, semplicemente capovolgere i parametri non produrrebbe il risultato corretto. In pratica, probabilmente troverai 'flip' utile. –