可能な限り直感的にライブラリの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が置換を行うタイミングを制御する方法はありますか?
タイプ・シノニムは、人間が消費するために設計されたものであるため、タイプ・シノニムを作成したことを認識しているため、置換を行いません。タイプファミリーは実際にタイプを計算/推定して表示するのではなく、タイプファミリーとの置換を行います。 – AndrewC
あなたの問題の解決方法はあなたの質問にあります - 省略したい場合はタイプ同義語を作ってください。 – AndrewC
@AndrewCさて、これはタイプ同義語と家族の区別の1つであることは決してありませんでしたが、意味があります。しかし、それでも型リストのdesugaringを残します。 –