gpt4 book ai didi

haskell - 刚性类型和相等性检查 - 这在 Haskell 中可能吗?

转载 作者:行者123 更新时间:2023-12-02 17:13:18 41 4
gpt4 key购买 nike

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

equal :: a -> b -> Bool
equal a b = a == b

最佳答案

不,(==) 的类型要求其参数类型相同

(==) :: Eq a => a -> a -> Bool

您询问是否可能(测试不同类型之间的相等性),是的,这是可能的,但不是您通常会做的事情。您可以使用Typeable见证 ab 是相同的类型,但您需要对它们两者进行 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

所以下面的作品

>> equal 10 'a'
False
>> equal 'X' 'a'
False
>> equal 'X' 'X'
True

确保您理解为什么我们只约束 Eq a/Eq b 之一,而哪一个并不重要。

关于haskell - 刚性类型和相等性检查 - 这在 Haskell 中可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49289149/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com