3

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

我希望实现一个 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 = ()

现在函数 g 只接受 a 和 b 如果它们具有不同的类型。这是在haskell中编码类型不平等的“惯用”方式吗?如果不是,它有什么问题?

4

2 回答 2

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
于 2013-07-19T22:56:05.020 回答
2

这是在HList库中完成的

{-# LANGUAGE FlexibleInstances, 
    MultiParamTypeClasses, 
    FunctionalDependencies, 
    UndecidableInstances ,
    IncoherentInstances
 #-}

data HTrue; data HFalse;

class TypeCast a b | a -> b
instance TypeCast a a

class TypeEq a b c | a b -> c
instance TypeEq x x HTrue
instance (TypeCast HFalse b) => TypeEq x y b
-- instance TypeEq x y HFalse -- would violate functional dependency

您现在可以完全推断类型相等:

typeEq :: TypeEq a b c => a -> b -> c
typeEq _ _ = undefined

请注意,typeEq 0 1 == HFalse因为0 :: Num a => a1 :: Num b => b

于 2013-07-22T18:12:56.943 回答