(从上一个问题编辑,我认为下面的代码不起作用)
我希望实现一个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中编码类型不等式的“独特”方式吗?如果没有,它有什么问题?
答案 0 :(得分:8)
{-# LANGUAGE DataKinds, PolyKinds, TypeFamilies #-}
type family Equal (a :: k) (b :: k) :: Bool
type instance where
Equal a a = True
Equal a b = False
答案 1 :(得分: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 => a
和1 :: Num b => b
之后的{{1}}。