복붙노트

[SCALA] 세트, 펑 및 식의 혼란

SCALA

세트, 펑 및 식의 혼란

논의는 스칼라의 압축 방법을 지원하는 이것은, 예를 들어 버그로 이어질 수있는 방법, 세트에 대한 최근 직장에서 와서

scala> val words = Set("one", "two", "three")
scala> words zip (words map (_.length))
res1: Set[(java.lang.String, Int)] = Set((one,3), (two,5))

나는 요소가 정렬되어 있지 않기 때문에, 세트, ​​우편 작업을 지원하지 것이 매우 분명하다 생각합니다. 그러나, 문제는 설정은 정말 펑 아니며,지도 방법이 안된다는 것을 제안했다. 물론, 당신은 설정을 통해 매핑 문제에 자신을 얻을 수 있습니다. 지금 하스켈로 전환,

data AlwaysEqual a = Wrap { unWrap :: a }

instance Eq (AlwaysEqual a) where
    _ == _ = True

instance Ord (AlwaysEqual a) where
    compare _ _ = EQ

지금 ghci에서

ghci> import Data.Set as Set
ghci> let nums = Set.fromList [1, 2, 3]
ghci> Set.map unWrap $ Set.map Wrap $ nums
fromList [3]
ghci> Set.map (unWrap . Wrap) nums
fromList [1, 2, 3]

그래서 설정은 펑터의 법칙을 만족하지

    fmap f . fmap g = fmap (f . g)

설정에지도 작업의 실패,하지만 우리가 정의하는 식 인스턴스의 실패는 대체 법을 존중하지 않기 때문에, 즉 그 A와 B의 식의 두 인스턴스 및이 아니라고 주장 할 수 있습니다 매핑 F : A -> B 다음

    if x == y (on A) then f x == f y (on B)

(예를 들어 = f를 푸는 고려) AlwaysEqual 대해 유지되지 않는다.

substition 법은 우리가 존중하는 것을 시도해야한다는 식의 유형에 대한 분별 법인가? 대체 우리가 곤경에 얻을 수있는 유일한 장소입니다, 그래서 물론, 다른 평등법은 우리의 AlwaysEqual 유형 존중 (대칭, 이행 성 및 재귀는 하찮게 만족하고 있습니다).

나를 위해, substition는 식 클래스에 대한 매우 바람직한 특성처럼 보인다. 한편, 최근 레딧 토론에 대한 몇 가지 의견은 다음과 같습니다

이 세 가지 모두 꽤 잘 내가 그들에 대해 갈 주저 것, 그래서 하스켈 커뮤니티에 공지되어 있으며, 내 식 유형 substitability 주장하고 있습니다!

세트 펑터 인에 대한 또 다른 인수 - 널리 모양을 유지하면서 펑터가되는 것은 당신이 "모음"의 "요소"를 변환 할 수 있다는 허용됩니다. 예를 들어, 하스켈 위키에서이 인용 (주에 이동은은 Functor의 일반화이다)

그리고 실제 세계 하스켈

분명히, 임의의 집합 펑 인스턴스는 집합의 원소 수를 줄임으로써, 형상을 변화시킬 가능성이있다.

설정이 정말 순간의 보통주의 요구 사항을 무시 펑 (해야하지만 그러나 그것은 보인다 - 내가 보는 그 인공 제한 효율적 세트, 모든 세트에 대한 절대적인 요구 사항과 사업에 우리의 욕망에 의해 부과 등의 기능의 예를 들어, 세트. 고려 완벽하게 합리적인 것입니다. 어떤 경우에는, 올렉은 보통주 제약 조건을 필요로하지 않는 설정을위한 효율적인은 Functor와 모나드 인스턴스)를 작성하는 방법을 보여 주었다. 그들을 위해 너무 많은 좋은 용도는 (같은이 존재하지 않는 모나드 예를 들어 사실이다)이있다.

사람이 혼란을 취소 할 수 있습니까? 펑터 수 설정해야 하는가? 그렇다면, 하나는 펑터 법규 위반의 가능성에 대해 어떻게합니까? 어떤 식의 법, 그리고 그들이 어떻게은 Functor 특히 설정 인스턴스에 대한 법률과 상호 작용해야합니까?

해결법

  1. ==============================

    1.나는이 그렇지 않은 경우에 정의하는 조건으로 "모양"비유를 복용하는 경우가 두려워 해요. 수학적으로 말하면, 전원 설정 펑터와 같은 일이있다. 위키 백과 :

    나는이 그렇지 않은 경우에 정의하는 조건으로 "모양"비유를 복용하는 경우가 두려워 해요. 수학적으로 말하면, 전원 설정 펑터와 같은 일이있다. 위키 백과 :

    함수 P (f)는 (전력 세트에서 펑 fmap 함수 F)를 인수 세트의 크기를 보존하지 않고, 또이 그럼에도 불구 펑이다.

    당신이 잘못 생각 직관적 인 비유를 원하는 경우에, 우리는이 말할 수 : 거짓 펑은 그 관계를 중단한다면 목록과 같은 구조로, 각 요소 다른 요소와의 관계에 대해 "염려", 그리고 "불쾌"될 것 . 그러나 세트는 제한하는 경우입니다 : 요소가 서로 무관심, 그래서 아주 작은 당신이 할 수있는 존재를 "불쾌"구조는; 거짓 펑이 포함되지 않은 결과에 해당 요소가 포함 된 세트 매핑한다면 유일한은 "목소리를."

    (좋아, 나는 ... 지금 종료됩니다)

    편집 : 내 대답의 상단에 당신을 인용 할 때 나는 다음과 같은 비트를 절단 :

    여기에 이동이 전문은 Functor의 일종이 아니라 그것의 "일반화"라고 발언 것입니다. (에 이동이 확장 접이식에 대한 사실이나,,,) 어떤에 이동에 관한 중요한 사실 중 하나는 어떤 구조의 요소는 선형 주문은 접이식으로 (그 요소의 목록에 어떤에 이동을 설정할 수 있어야한다는 것입니다. toList).

    에 이동에 대한 또 다른, 덜 분명한 사실은 다음과 같은 기능 (긴팔 원숭이 & 올리베이라, "반복자 패턴의 본질"에서 적응)이 존재한다는 것입니다 :

    -- | A "shape" is a Traversable structure with "no content," 
    -- i.e., () at all locations.
    type Shape t = t ()
    
    -- | "Contents" without a shape are lists of elements.
    type Contents a = [a]
    
    shape :: Traversable t => t a -> Shape t
    shape = fmap (const ())
    
    contents :: Traversable t => t a -> Contents a
    contents = Foldable.toList
    
    -- | This function reconstructs any Traversable from its Shape and
    -- Contents.  Law:
    --
    -- > reassemble (shape xs) (contents xs) == Just xs
    --
    -- See Gibbons & Oliveira for implementation.  Or do it as an exercise.
    -- Hint: use the State monad...
    --
    reassemble :: Traversable t => Shape t -> Contents a -> Maybe (t a)
    

    비어 있지 않은 모든 세트가 그 내용입니다 같은 모양-설정이 때문에 세트에 대한에 이동 인스턴스가, 제안 된 법을 위반하는 [()] 버튼. 이로부터 당신이 세트를 조립하려고 할 때마다 당신이 오직 빈 세트 또는 싱글 톤 다시 얻을 것이라는 점을 증명하기 쉬워야한다.

    교훈? 매우 구체적인에서에 이동 "보존 모양", 펑터보다 더 강한 의미.

  2. ==============================

    2.식 세트가 "좋은"(합동이 교체 보유 즉 하위)이다 Hask의 하위에서 "단지"는 펑 (되지 펑터)이다. 제약 종류는 그때 아마 어떤 종류의 펑터 것이다 설정 방법에서 주변에 있다면.

    식 세트가 "좋은"(합동이 교체 보유 즉 하위)이다 Hask의 하위에서 "단지"는 펑 (되지 펑터)이다. 제약 종류는 그때 아마 어떤 종류의 펑터 것이다 설정 방법에서 주변에 있다면.

  3. ==============================

    3.음, 설정이 공변 펑터로 취급 될 수있는 contravariant 펑 등; 보통은 공변 펑입니다. 그것은 평등에 관한 행동에 대한 그리고 하나는 확실히 어떤 구현, 그것은 않는 것을 확인해야한다.

    음, 설정이 공변 펑터로 취급 될 수있는 contravariant 펑 등; 보통은 공변 펑입니다. 그것은 평등에 관한 행동에 대한 그리고 하나는 확실히 어떤 구현, 그것은 않는 것을 확인해야한다.

    Set.zip에 관해서는 - 그것은 넌센스입니다. Set.head뿐만 아니라 (당신은 스칼라에 있습니다). 그것은 존재하지 않아야합니다.

  4. from https://stackoverflow.com/questions/19177125/sets-functors-and-eq-confusion by cc-by-sa and MIT license