刚性类型和相等性检查 - 这在Haskell中是否可行?

Don*_*ein 2 haskell types

想知道是否在Haskell中遵循代码?

equal :: a -> b -> Bool
equal a b = a == b
Run Code Online (Sandbox Code Playgroud)

Ice*_*ack 9

不,类型(==)要求其参数属于同一类型

(==) :: Eq a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)

你问是否可能(测试不同类型之间的相等性),是的,这是可能的,但不是你通常做的事情.您可以Typeable用来见证它a并且b是相同的类型,但是你需要Typeable对它们两者都有Eq约束(并且对它们都有约束)

{-# Language ScopedTypeVariables #-}
{-# Language TypeApplications    #-}
{-# Language ConstraintKinds     #-}
{-# Language GADTs               #-}

import Type.Reflection

type Equal a b = (Eq a, Typeable a, Typeable b)

equal :: forall a b. Equal a b => a -> b -> Bool
equal x y =
  case eqTypeRep (typeRep @a) (typeRep @b) of
    -- In this branch, `a' and `b' are the SAME type
    -- so `(==)' works
    Just HRefl -> x == y

    -- Values of different types are never equal
    Nothing -> False
Run Code Online (Sandbox Code Playgroud)

以下是有效的

>> equal 10 'a'
False
>> equal 'X' 'a'
False
>> equal 'X' 'X'
True
Run Code Online (Sandbox Code Playgroud)

确保你理解为什么我们只约束其中一个Eq a/ Eq b哪个并不重要.