Tôi đang cố gắng làm cho các loại ghci hiển thị cho thư viện của mình trực quan nhất có thể, nhưng tôi đang gặp rất nhiều khó khăn khi sử dụng các tính năng loại nâng cao hơn.
Giả sử tôi có mã này trong một tệp:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
Tôi tải nó lên bằng ghci, sau đó tôi gõ lệnh sau:
ghci> :t undefined :: Container '[String,String,String,String,String]
Thật không may, ghci cho tôi cái nhìn khá xấu xí:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci đã loại bỏ đường cho các chuỗi cấp loại. Có cách nào để ngăn ghci làm điều này và chỉ cho tôi phiên bản đẹp không?
Trên một ghi chú liên quan, giả sử tôi tạo một Replicate
hàm cấp loại
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
Bây giờ, khi tôi hỏi ghci cho một loại sử dụng LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci rất tốt và cho tôi kết quả khá:
undefined :: Container LotsOfStrings
Nhưng nếu tôi yêu cầu Replicate
phiên bản d,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
ghci thay thế cho họ kiểu khi nó không làm điều đó cho từ đồng nghĩa kiểu:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
Tại sao ghci thực hiện thay thế cho họ kiểu, mà không phải là từ đồng nghĩa kiểu? Có cách nào để kiểm soát khi nào ghci sẽ thay thế?
[Char]
và đôi khi được hiển thị dưới dạng String
?
String->String
, thì kiểu kết quả của nó sẽ được hiển thị dưới dạng String
. Tuy nhiên, nếu nó phải xây dựng một kiểu từ các mảnh, chẳng hạn như "abc"
(giống như 'a':'b':'c':[]
) thì không có từ đồng nghĩa nào để bảo toàn. Đây là suy đoán thuần túy.
String
được hợp nhất với các biến kiểu f a
hoặc [a]
, nó sẽ được hiển thị như [Char]
sau vì những lý do tương tự.