'惯用'Haskell型不等式

toh*_*ava 3 haskell types ghc type-equivalence

(从上一个问题编辑,我认为下面的代码不起作用)

我希望实现一个haskell函数f,它具有一个限制,使得它的2个参数不能具有相同的类型.我使用了以下代码:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances, FlexibleInstances, FlexibleContexts, TypeFamilies, IncoherentInstances #-}
data HTrue = HTrue
data HFalse = HFalse

class HEq x y b | x y -> b
instance (b ~ HTrue) => HEq x x b
instance (b ~ HFalse) => HEq x y b


g :: (HEq a b HFalse) => a -> b -> ()
g x y = ()
Run Code Online (Sandbox Code Playgroud)

现在函数g只接受a和b,如果它们有不同的类型.这是在haskell中编码类型不等式的"独特"方式吗?如果没有,它有什么问题?

cdk*_*cdk 8

随着 GHC中添加了 功能,您将能够编写:

{-# LANGUAGE DataKinds, PolyKinds, TypeFamilies #-}

type family Equal (a :: k) (b :: k) :: Bool
type instance where
   Equal a a = True
   Equal a b = False
Run Code Online (Sandbox Code Playgroud)