2017-03-23 1 views
2

LYAH는 말한다 :유닛 유형이 열거 형 typecass의 멤버 인 이유는 무엇입니까?

Enum 회원들이 순차적으로 유형을 정렬 - 그들은 열거 할 수있다. Enum typeclass의 주요 이점은 목록 범위에서 해당 형식을 사용할 수 있다는 것입니다. 그들은 또한 후계자와 선임자를 정의했으며, 이들은 succpred 기능을 사용할 수 있습니다. 이 클래스의 유형은 (), Bool, Char, Ordering, Int, Integer, FloatDouble입니다.

()은 왜이 typeclass의 멤버입니까? 모든 필수 기능을 지원하지만 유용하지는 않습니다. 즉, succpred은 항상 실패하며 목록 범위에서 사용하면 () 자체 만 생성됩니다.

+0

'Bounded'이기 때문에'[minBound..maxBound]'가 작동합니다. –

답변

4

이러한 종류의 일에 대한 비공식적 인 정책은 "(법을 준수하는 방식으로는 될 수 없다면) 인스턴스로 만듭니다". 이 정책은 과거에 몇 가지 놀라움을 낳았습니다 (터플을 염두에두기 위해 Foldable/Traversable 인스턴스가 있음). 그러나 대부분은 긍정적 인 반응을 보입니다. 다양한 클래스에 대해 다형성을 사용하려는 일부 함수를 찾아내는 것이 일반적입니다. 구체적 유형에 적절한 코드가 있기 때문에 현재 코드에서 필요로하는 구체적인 유형에 적합하다는 것을 알게되어 기쁩니다. 인스턴스가 제 위치에 있습니다.

+3

나는 이것이 정책, 공식 또는 다른 것으로 생각하지 않는다 (나는 분명히 동의하지 않을 것이다). 그렇지 않으면 우리는 인스턴스 Monoid Int를 가질 것입니다. {mempty = 0; mappend = (+)}'. 나는 정책이 "법을 준수하고 비 병리학적인 방법으로 정확히 한 가지만 있다면 현실이되게하십시오"라고 말하고 싶습니다. "비 병리학적인"비트는 물론 모호하지만,'Enum()'의 경우에는 인스턴스가 무엇을해야하는지 완전히 명백합니다. – leftaroundabout

+0

@leftaroundabout 뉘앙스에 감사드립니다. 나는 이것이 그 정책의 중요한 부분임을 동의합니다. –

+0

'Foldable' /'Traversable' 포인트를 확장하려면 다음 코드를 고려하십시오 :'maximum (1,0)'. 이것은 분명히'1'과 같아 보이지만 실제로는'0'입니다. 왜냐하면 튜플에 대한 Foldable은 두번째 요소를'foldMap f (_, y) = fy'이다. – Lazersmoke

관련 문제