Domanda

È possibile che Haskell applichisca il costruttore del tipo di freccia della funzione (->) al solo il suo tipo di destra (ad esempio: (-> a)) per ottenere un costruttore di tipo di tipo * -> *?

È stato utile?

Soluzione

No, è attualmente impossibile. Ci sono certe limitazioni al sistema di tipo Haskell che lo consentono di essere utile e conveniente per la maggior parte dei casi, e questa è una di quei limiti. La tua migliore alternativa è usare una NewType.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }
.

NewTypes sono semplicemente tag per aiutare il compilatore a sapere come digitare e eseguire correttamente la spedizione diretta a tipo (typeclasses). Presumibilmente volevi capovolgere gli argomenti di tipo per fornire un'istanza di Typeclass. Ciò significa solo che ogni volta che vuoi utilizzare le funzioni di Typeclass, devi decorare qualsiasi input specifici con FuncFlip e indetti eventuali output specifici con unFuncFlip. Questo è leggermente più verboso del desiderato, ma in realtà non è così male, perché ti costringe a identificare esplicitamente quale istanza del typeclass che si desidera utilizzare.

È possibile creare un'istanza di NewType per questo, che può o non può rivelarsi conveniente per te.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip
.

Ulteriore lettura: Ci sono "Tipo -Level Combinatos? "

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