No, non è mal-formata. Il tipo è strano e probabilmente non ci possono essere valori significativi per i quali ha senso ma è ancora permesso.
Ricordare che i valori letterali sono sovraccarichi. 1
è non un numero intero. È tutto del tipo Num
. Le funzioni sono non escluse da questo. Non esiste una regola che dica a -> t
non può essere "un numero" (ad esempio un'istanza di Num
).
Per esempio si potrebbe avere un instance
dichiarazione del tipo:
instance Num a => Num (a -> b) where
fromInteger x = undefined
[...]
ora 1 1
sarebbe semplicemente uguale undefined
. Non molto utile ma ancora valido.
È possibile avere le definizioni utili di Num
per le funzioni. Ad esempio, dal wiki
instance Num b => Num (a -> b) where
negate = fmap negate
(+) = liftA2 (+)
(*) = liftA2 (*)
fromInteger = pure . fromInteger
abs = fmap abs
signum = fmap signum
Con questo si può scrivere cose come:
f + g
dove f
e g
sono funzioni numeri di ritorno.
L'utilizzo della suddetta dichiarazione di istanza 1 2
equivale a 1
. Fondamentalmente un valore letterale utilizzato come funzione con l'istanza di sopra è uguale a const <that-literal>
.
A proposito, ci sono esempi pratici di un'espressione come '1 2' o' True "ciao" 'o' "ciao" [1,2,3] 'etc è utile? DSL credo? –
'True' non è sovraccarico - è un vero costruttore del' data Bool = False | True' tipo di dati – Fraser
@ErikAllik Non ho mai visto questo usato in questo modo. Potrebbe essere possibile ma AFAIK non è usato. – Bakuriu