之所以Set
不是给定函子here。似乎可以归结为这样一个事实:a == b && f a /= f b
是可能的。那么,为什么 Haskell 没有 Eq 的标准替代品,比如
class Eq a => StrongEq a where
(===) :: a -> a -> Bool
(/==) :: a -> a -> Bool
x /== y = not (x === y)
x === y = not (x /== y)
哪些情况应该遵守法律
∀a,b,f. not (a === b) || (f a === f b)
∀a. a === a
∀a,b. (a === b) == (b === a)
也许还有其他一些?那么我们可以有:
instance StrongEq a => Functor (Set a) where
-- ...
或者我错过了什么?
Edit:我的问题不是“为什么有些类型没有Eq
例如?”,就像你们中的一些人似乎已经回答了一样。恰恰相反:“为什么会有这样的例子?Eq
不是外延相等的吗?为什么有太多Eq
实例?”,与“如果a == b
确实意味着外延平等,为什么Set
不是一个实例Functor
?”.
另外,我的实例声明是垃圾(感谢@n.m.)。我应该说:
newtype StrongSet a = StrongSet (Set a)
instance Functor StrongSet where
fmap :: (StrongEq a, StrongEq b) => (a -> b) -> StrongSet a -> StrongSet b
fmap (StrongSet s) = StrongSet (map s)
instance StrongEq a => Functor (Set a) where
无论在 Haskell 中还是在事物的宏大数学/分类方案中,这都没有意义,无论什么StrongEq
means.
在哈斯克尔中,Functor
需要 kind 的类型构造函数* -> *
。箭头反映了这样一个事实:在范畴论中,函子是一种映射。[]
和(假设的)Set
是这样的类型构造函数。[a]
and Set a
有善良*
并且不能是函子。
在 Haskell 中,很难定义Set
从而可以将其制成Functor
因为无论如何都无法为某些类型合理地定义相等性。你不能比较两种类型的东西Integer->Integer
, 例如。
假设有一个函数
goedel :: Integer -> Integer -> Integer
goedel x y = -- compute the result of a function with
-- Goedel number x, applied to y
假设你有一个值s :: Set Integer
. What fmap goedel s
应该是什么样子?如何消除重复项?
在典型的集合论中,平等被神奇地定义为一切,包括函数,所以Set
(or Powerset
准确地说)是一个函子,这没问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)