Je suis en train de récupérer le Symbol
utilisé dans le type d'une valeur:Impossible d'utiliser la signature de type déduit ghci-pour la fonction retour Chantez (d :: Symbole)
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Temp where
import GHC.TypeLits
data Temp (d :: Symbol) (a :: *) where
T :: a -> Temp d a
{-
description :: SingI Symbol d => Temp d a -> Sing Symbol d
-}
description (_ :: Temp d a) = (sing :: Sing d)
Cette charge bien dans ghci
(version 7.6.1):
% ghci
GHCi, version 7.6.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l Temp
[1 of 1] Compiling Temp (Temp.hs, interpreted)
Ok, modules loaded: Temp.
*Temp> :t description
description :: SingI Symbol d => Temp d a -> Sing Symbol d
Cependant, si je tente d'utiliser le type inférée par ghci
dans le module lui-même (décommentant la ligne Temp.hs), je reçois l'erreur suivante:
Temp.hs:14:16:
`SingI' is applied to too many type arguments
In the type signature for `description':
description :: SingI Symbol d => Temp d a -> Sing Symbol d
Ce qui est logique pour moi, depuis Sing
and SingI
seem to take a single parameter in the documentation.
Quelle est la signature de type appropriée pour description
?
Cela ressemble à un bug dans la jolie imprimante; Il semble que cela ne devrait pas être de jolies impressions de valeurs inférées d'arguments de type implicites si vous ne pouvez pas donner explicitement ces gentils arguments! –
J'ai observé le même affichage buggé avec 'Nat'. Je supposais qu'il essayait d'imprimer une sorte de signature en quelque sorte, mais afficher incorrectement un argument gentil implicite a plus de sens ... –