6
我偶爾遇到這個問題,最後想問一下是否有一個共同的解決方案或模式。 是否有可能在嵌套上下文引用中創建一個類型變量來自外部上下文的類型?例如,Haskell引用一個類型變量
foo :: a -> ... -> ..
foo = ...
where bar :: a -> ...
現在bar
的a
比富的a
不同。通常情況下,這是我想要的,但偶爾它會讓生活變得困難,我需要讓它們變得一樣。我使用骯髒的技巧來迫使類型檢查者在過去統一這兩種技巧,但偶爾也會受到挫折。這是我最新的例子(一個Parsec函數),它激勵我最終提出這個問題。
data Project = ... deriving Enum
data Stuff = ...
pProject :: Monad m => P m Stuff
pProject = do
stuff <- pStuff
...
convert stuff <$> pEnum :: P m Project
pEnum :: (Monad m, Enum a) => String -> P m a
pEnum = ...
的convert
函數需要一個類型,因此,我必須指定註釋:: P m Project
。 但是,這意味着我還必須介紹m
,這不幸與功能簽名中的m
不一樣。類型檢查報告,這有:
無法推斷
Monad m1
從使用pEnum
從上下文Monad m
產生有引用函數簽名的m
沒有一些醜陋的黑客攻擊的方法嗎?(一個醜陋的黑客是將不會得到執行,但存在只是爲了統一這兩種類型的僞碼。)
感謝您指出'ScopedTypeVariables'只適用於具有顯式'forall'的簽名。難怪它似乎幾乎從未工作過...... – Cirdec 2014-12-06 00:51:05
這並不完全正確 - 'ScopedTypeVariables'使類型變量在類聲明中作用域,即使沒有'forall'也是如此。所以它可以改變一個人爲設計的Haskell 2010程序的含義。 – shachaf 2014-12-06 01:52:07