不能使用ghci推断的类型签名来返回Sing(d :: Symbol)的函数

ram*_*ion 5 haskell

我正在尝试恢复Symbol值的类型中使用的:

{-# 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)
Run Code Online (Sandbox Code Playgroud)

这在ghci(版本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
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用ghci模块本身推断的类型(取消注释Temp.hs中的行),我会收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为SingSingI似乎采取了文档中的单个参数.

什么是正确的类型签名description

ram*_*ion 2

好吧,通过一些胡闹得到了它:

description :: SingI d => Temp d a -> Sing d
Run Code Online (Sandbox Code Playgroud)

看起来正在进行一些时髦的重写,但目前已经足够好了。