当我尝试创建一个返回函数Thing a(ThingGADT 在哪里)时,我目前正在与类型检查器进行斗争。一个最小的例子:
{-#LANGUAGE GADTs, EmptyDataDecls #-}
module Main where
-- Define a contrived GADT
data TFoo
data TBar
data Thing a where
Foo :: Int -> Thing TFoo
Bar :: String -> Thing TBar
combine :: [Thing a]
combine = [Foo 1, Bar "abc"]
main :: IO ()
main = undefined
Run Code Online (Sandbox Code Playgroud)
a类型检查器对不匹配感到不高兴TBar。想必这是因为它已经推断出来a了TFoo。但是,这是令人惊讶的,因为使用常规求和类型,您可以执行以下操作:
data Thing = Foo Int | Bar String
combine :: [Thing]
combine = [Foo 1, Bar …Run Code Online (Sandbox Code Playgroud)