2012-09-24 2 views
5

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?

+2

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! –

+1

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 ... –

Répondre

2

Ok, il a obtenu par une monkeying sur:

description :: SingI d => Temp d a -> Sing d 

On dirait qu'il ya une ré-écriture géniale passe, mais assez bon pour l'instant.

Questions connexes