Domanda

Impara a Haskell discute newtype. .

In che modo la sua firma di Pair b a significa che l'argomento superato deve essere una tupla?

ghci> newtype Pair b a = Pair { getPair :: (a, b) }
ghci> let p = Pair (5, 10)
.

Sono confuso come b a indica una tupla.

È stato utile?

Soluzione

Il motivo per cui passi in una tupla non è nel tipo, ma nel suo costruttore:

Pair { getPair :: (a, b) }
.

Questo sta usando Record Syntax per definireUn costruttore Pair con un singolo campo chiamato getPair, che contiene una tupla.Potresti ottenere un effetto molto simile rompendolo in due parti:

newtype Pair b a = Pair (a, b)

getPair (Pair (x, y)) = (x, y)
.

Quindi il b a non forzalo per essere una tupla;Questo è ciò che il { getPair :: (a, b) } fa.

Altri suggerimenti

La confusione arriva perché hai il nome del tipo di dati e il nome del costruttore sia specificato come Pair.Invece, potresti scrivere equivalentemente

newtype Pair b a = MkPair { getPair :: (a, b) }
.

Allora lo costruisci con

> let p = MkPair ("test", 10) :: Pair Int String
.


.

Costruttori e nomi di tipo non condividono gli spazi dei nomi, in modo che possano avere lo stesso nome senza contrastanti.Questo motivo viene spesso utilizzato per newypes, dal momento che il nome del tipo è solitamente un buon nome descrittivo per il costruttore.Questo funziona anche per i tipi dichiarati con la parola chiave data.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top