내 라이브러리의 유형 ghci 디스플레이를 가능한 한 직관적으로 만들려고 노력하고 있지만 더 고급 유형 기능을 사용할 때 많은 어려움이 있습니다.
파일에이 코드가 있다고 가정 해 보겠습니다.
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
ghci에서로드 한 다음 다음 명령을 입력합니다.
ghci> :t undefined :: Container '[String,String,String,String,String]
불행히도 ghci는 나에게 다소 추한 모습을 보여줍니다.
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci는 유형 수준 문자열의 설탕을 제거했습니다. 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에게 다음을 사용하여 유형을 요청할 때 LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci는 훌륭하고 예쁜 결과를 제공합니다.
undefined :: Container LotsOfStrings
하지만 Replicate
d 버전을 요청하면
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
ghci는 유형 동의어를 사용하지 않았을 때 유형 계열을 in으로 대체합니다.
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
ghci가 유형 계열을 대체하지만 유형 동의어가 아닌 이유는 무엇입니까? ghci가 언제 대체를 수행할지 제어하는 방법이 있습니까?
[Char]
되고 때로는 표시되는 이유는 무엇 String
입니까?
String->String
결과 유형은로 표시됩니다 String
. 그러나 예에서와 같이 조각에서 유형을 구성해야하는 경우 "abc"
(와 동일 'a':'b':'c':[]
) 보존 할 동의어가 없습니다. 이것은 순수한 추측입니다.
String
이 유형 변수 f a
또는으로 통합 [a]
되면 [Char]
유사한 이유로 나중에 다음과 같이 표시 될 것 입니다.