2013-05-02 3 views
94

可能な限り直感的にライブラリのghci表示を行うようにしようとしていますが、より高度なタイプの機能を使用すると多くの問題が発生しています。ghci desugarがリストとタイプファミリーを入力するのはなぜですか?これを選択的に無効にすることはできますか?

のは、私は、ファイルにこのコードを持っているとしましょう:

{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE DataKinds #-} 
{-# LANGUAGE TypeOperators #-} 

import GHC.TypeLits 

data Container (xs::[*]) = Container 

私はその後、私は、次のコマンドを入力し、GHCiの中でそれをロードします。

ghci> :t undefined :: Container '[String,String,String,String,String] 

は残念ながら、GHCiのは私ではなく醜いを与えます検索:

ghciはレベルレベル文字列の砂糖を削除しました。 ghciがこれをやってくれるのを防ぐ方法がありますか?関連ノートで


、私はLotsOfStringsを使用してタイプにGHCiのを頼むときに私は、タイプレベルReplicate機能今

data Nat1 = Zero | Succ Nat1 

type family Replicate (n::Nat1) x :: [*] 
type instance Replicate Zero x = '[] 
type instance Replicate (Succ n) x = x ': (Replicate n x) 

type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String 

を作成すると言うことができます:

ghci> :t undefined :: Container LotsOfStrings 

GHCiのがいいです私にはきれいな結果をもたらします:

しかし、それは型シノニムのためにそれをしなかったとき、私はタイプの家族のために、Replicate Dバージョンのため

ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String) 

GHCiの代替を尋ねる場合:なぜGHCiのをやっている

:: Container 
     ((':) 
      * 
      [Char] 
      ((':) 
      * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *)))))) 

タイプファミリの代用ではなく、タイプシノニムではありませんか? ghciが置換を行うタイミングを制御する方法はありますか?

+7

タイプ・シノニムは、人間が消費するために設計されたものであるため、タイプ・シノニムを作成したことを認識しているため、置換を行いません。タイプファミリーは実際にタイプを計算/推定して表示するのではなく、タイプファミリーとの置換を行います。 – AndrewC

+0

あなたの問題の解決方法はあなたの質問にあります - 省略したい場合はタイプ同義語を作ってください。 – AndrewC

+0

@AndrewCさて、これはタイプ同義語と家族の区別の1つであることは決してありませんでしたが、意味があります。しかし、それでも型リストのdesugaringを残します。 –

答えて

0
import GHC.TypeLits 

data Container (xs::[*]) = Container 

私はGHCiの中でそれをロードし、その後、私は次のコマンドを入力します。種類:私が使用しているのを知っている

:t undefined :: Container '[String,String,String,String,String] 
+0

そう...?あなたはまだ私が想像していた結果を得ます。 'String(( ':) * String((' ')* String((' ':) * ...') – leftaroundabout

2

回避策。例えば、

GHCiの>:種類(コンテナ '[文字列、文字列、文字列、文字列、文字列])

を与える:

(コンテナ' [文字列、文字列、文字列、文字列、文字列]):: *

ながら

ghci>:種類!:)

* 
    [Char] 
    ((':) 
    * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *)))))) 
:(Containerの

コンテナ

(([文字列、列、列、列、文字列])

はこのような何かを印刷します "

もちろん、ghciにkindという別の質問をしていますが、それはうまくいきます。undefined ::とにかく回避策のようなものだから、これで十分だろうと思った。

+0

私は '' undefined :: '簡単な例です。実際の問題は、1000種類の異なるタイプのリストを持つエラーメッセージが表示された場合です。ページを印刷して解析するのは非常に難しいです。 –

+0

ええ、十分です。それを実現しました。私はあなたに良い答えがあります – user2141650

2

今後のGHC 7.8では修正されています。

GHC 7.6は、データ型がPolyKindsを使用する場合に種類を出力します。したがって、(':) String '[]ではなく、(':) * String ('[] *)と表示されます。

GHC 7.8では、デフォルトでは種類が表示されなくなり、データ型は期待どおりリストとしてきれいに印刷されます。新しいフラグ-fprint-explicit-kindsを使って、GHC 7.6のように明示的な種類を見ることができます。私はこれの理由を知らない、多分明示的な種類はPolyKindsを理解するための援助であることを意図していた。