我只是做了一些Haskell开发,并在新版本的GHC上重新编译了一些旧代码:
The Glorious Glasgow Haskell Compilation System, version 7.2.1
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
警告:不推荐使用-XDatatypeContexts:它被广泛认为是错误的,并且已从Haskell语言中删除.
当您拥有以下格式的代码时,会出现这种情况:
data Ord a => MyType a
= ConstructorOne a
= ConstructorTwo a a
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么这个功能首先被弃用,而我应该做些什么而不是实现相同或类似的功能呢?
有很多关于GADTs
比 更好的问答DatatypeContexts
,因为 GADT 会自动在正确的位置提供约束。例如这里,这里,这里。但有时似乎我仍然需要一个明确的约束。这是怎么回事?改编自此答案的示例:
{-# LANGUAGE GADTs #-}
import Data.Maybe -- fromJust
data GADTBag a where
MkGADTBag :: Eq a => { unGADTBag :: [a] } -> GADTBag a
baz (MkGADTBag x) (Just y) = x == y
baz2 x y = unGADTBag x == fromJust y
-- unGADTBag :: GADTBag a -> [a] -- inferred, no Eq a
-- baz :: GADTBag a -> Maybe [a] -> …
Run Code Online (Sandbox Code Playgroud)