ho scritto una funzione Haskell che divide un elenco xs
in (init xs, last xs)
in questo modo:Rileva valore di fondo in Haskell
split xs = split' [] xs
where
split' acc (x:[]) = (reverse acc, x)
split' acc (x:xs) = split' (x:acc) xs
Da una lista vuota non può essere divisa in questo modo, non v'è alcuna corrispondenza per la lista vuota. Tuttavia, non volevo semplicemente la funzione error ...
. Così ho definito il seguente:
split [] = ([], undefined)
Grazie alla valutazione pigra posso quindi definire una cassaforte init
che restituisce semplicemente la lista vuota per la lista vuota:
init' = fst . split
C'è qualche modo come ho potuto rilevare l'indefinito se ho cercato di accedervi, in modo tale che
last' xs
| isUndefined (snd xs) = ...
| otherwise = ...
so circa Maybe
e Either
, e che quelli sono una scelta migliore per esprimere ciò che voglio. Tuttavia mi sono chiesto se c'è un modo per rilevare un valore reale non definito, cioè in termini di errori di cattura, come la cattura di eccezioni.
La risposta semplice è NO. Non è possibile rilevare undefined. (Una risposta più complicata è che puoi trovare eccezioni nel momad di I/O, ma non è quello che vuoi fare qui.) – augustss