我做了一些搜索,并認為這LiberalTypeSynonyms將允許它。partially applied type synonyms在某些情況下,它允許用作 Type 的引數。
{-# LANGUAGE LiberalTypeSynonyms #-}
type Value a = ExceptT [a] Identity a
type Apply m a = m a
run1 :: Apply Value a -> IO ()
run1 e = undefined
但是以下在 TypeApplications 中不起作用,為什么以及是否可以編譯?
{-# LANGUAGE LiberalTypeSynonyms #-}
{-# LANGUAGE TypeApplications #-}
type Value a = ExceptT [a] Identity a
run :: m Int -> IO ()
run e = undefined
main :: IO ()
main = do
print "begin"
let a = run @Value
print "end"
上面的代碼由于錯誤無法編譯
? The type synonym ‘Value’ should have 1 argument, but has been given none
? In the expression: run @Value
In an equation for ‘a’: a = run @Value
In the expression:
do print "begin"
let a = run @Value
print "end"
|
30 | let a = run @Value
uj5u.com熱心網友回復:
這和 沒有太大關系-XTypeApplications。Haskell通常不允許在沒有完全應用引數的情況下使用型別同義詞。所做-XLiberalTypeSynonyms的只是規避這一點,以防可以行內整個運算式——例如,如果你有
{-# LANGUAGE LiberalTypeSynonyms #-}
type IntApplied f = f Int
type List a = [a]
foo :: IntApplied List
foo = [1,2,3]
在這種情況下,型別同義詞可以在foo :: [Int]發生任何型別檢查或實體決議之前直接替換為 ,然后替換為 。這就像一個簡單的宏處理器可以做的事情。
但是在您的情況下,您正試圖將不完整的型別同義詞按原樣傳遞給其他東西。run不知道它接收的型別變數是否可以以這種方式“行內”,但它通常需要能夠匹配這個變數,而這在一般型別級函式上是不可能的(你可以用型別同義詞/家族定義),它只能在型別建構式上。
請參閱https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0242-unaturated-type-families.rst了解 Haskell 如何在這個主題上取得進展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427255.html
