5

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)

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

ただし、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

これは私には理にかなっています。なぜなら、ドキュメントでは単一のパラメータを使用しているように見えるからSingですSingI

の適切な型署名はdescription何ですか?

4

1 に答える 1

2

わかりました、いくつかの猿を介してそれを取得しました:

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

ファンキーな書き直しが行われているようですが、今のところは十分です。

于 2012-09-24T16:51:55.560 に答える