Haskell 在类型级别未定义

Haskell 在类型级别未定义,haskell,types,undefined,ghc,type-kinds,Haskell,Types,Undefined,Ghc,Type Kinds,通常,当我使用Haskell代码时,我会使用类型注释和未定义的来删除内容 foo :: String -> Int foo = undefined 是否有一个类型级别“undefined”可以用类似的方式使用 (理想情况下,与种类注释结合使用) 对同一个线程的进一步思考:有没有一种方法可以让我为以这种方式创建的类型剔除typeclass实例?比下面的理论方法更简单的方法 instance Monad Foo where return = undefined (>>=)

通常,当我使用Haskell代码时,我会使用类型注释和
未定义的
来删除内容

foo :: String -> Int
foo = undefined
是否有一个类型级别“undefined”可以用类似的方式使用

(理想情况下,与种类注释结合使用)

对同一个线程的进一步思考:有没有一种方法可以让我为以这种方式创建的类型剔除typeclass实例?比下面的理论方法更简单的方法

instance Monad Foo where
  return = undefined
  (>>=) = undefined

您可以使用
EmptyDataDecls
删除一个类型,并使用
KindSignatures
为其指定一种类型:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-}

data Foo :: * -> *
您还可以使用此选项将
Monad
实例在没有警告的情况下注销到GHC

{-# OPTIONS_GHC -fno-warn-missing-methods #-}

instance Monad Foo

然后您不需要为
return
>=

留下任何实现,这个问题很久以前就被提出并回答过了;此后,最佳做法不断发展


现在,您应该使用的是存根代码,而不是
未定义的
,以及它们的类型级别模拟。

很好!这正是我想要的;它甚至更方便,因为您不必编写
Foo=Undefined
!还有亲切的签名!我相信它与类型别名不同——当您引入一个新数据时,
fooa=a
。因此,它与问题的代码不一样,这可能没问题。@gatoatigrado:我认为要求只是尚未编写的类型的占位符,而不是类型别名本身,因此这是一个合适的解决方案。不管怎样,很高兴帮助你,丹!
{-# OPTIONS_GHC -fno-warn-missing-methods #-}

instance Monad Foo