Set
이 functor가 아닌 이유는 here입니다. a == b && f a /= f b
이 가능하다는 사실로 요약됩니다. 그럼, 왜하는 경우는 법률 왜 하스켈은 Eq의 강력한 대안을 가지고 있지 않습니까?
∀a,b,f. not (a === b) || (f a === f b)
∀a. a === a
∀a,b. (a === b) == (b === a)
어쩌면 약간 다른 사람을 순종하기로되어 있으며, 표준으로
class Eq a => StrongEq a where
(===) :: a -> a -> Bool
(/==) :: a -> a -> Bool
x /== y = not (x === y)
x === y = not (x /== y)
같은 것을 식의 대안을 하스켈하지 않는 이유는 무엇입니까? 그러면 우리는 다음을 가질 수 있습니다 :
instance StrongEq a => Functor (Set a) where
-- ...
또는 뭔가 빠졌습니까?
편집 : 내 문제는? "왜 Eq
예를없이 종류가 있습니다"당신의 일부가 대답 한 것처럼되지 않습니다. 그것은 반대입니다 : "왜 연장적으로 동일하지 않은 Eq
의 인스턴스가 있습니까? Eq
인스턴스가 너무 많은 이유는 무엇입니까? "a == b
이 확장 항등을 암시하는 경우 이 (가) Functor
의 인스턴스가 아닌 이유는 무엇입니까?"
또한 내 인스턴스 선언은 쓰레기 (thanks @ 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)
나는 Michael의 예가 유효하지 않다고 주장 할 것이다. '=='_ 관찰 할 수있는 모든 수단에 의해 동등한 것을 "보아야합니다. (꼭 'a == b'는 _identical 구현을 위해서만 필요합니다.)하지만, 공식적으로'a'와'b '로 할 수있는 것 '다시 같은 결과를 가져와야한다. 그래서'unAlwaysEq'는 절대로 노출되어서는 안된다.) 어떤 타입에 대해 이것을 보장 할 수 없다면,'Eq' 인스턴스를 제공해서는 안됩니다. – leftaroundabout
의미가없는 인스턴스를 정의하는 경우, 작성한 코드가 이상한 동작을하기를 기대해야합니다.'Set.map'의 출력 타입은'Ord' 제약 조건을 필요로하기 때문에'Set'는 펑터가 아닙니다. 인스턴스 인스펙터 Functor (Set a)는 ... 유효하지 않습니다. – user2407038
스칼라에는'Set'을위한'fmap'이 있습니다. 그것은 나에게 (그리고 동료들) 여러 번 물었습니다. – ziggystar