想知道是否在Haskell中遵循代码?
equal :: a -> b -> Bool
equal a b = a == b
Run Code Online (Sandbox Code Playgroud)
不,类型(==)
要求其参数属于同一类型
(==) :: 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
哪个并不重要.