2017-03-16 1 views
0

나는이 같은 Num a => a을 만들 수 있습니다Num은 이런 식으로 특별합니까?

foo :: Num a => a 
foo = 2 

을 유사하게 다른 수의 클래스 :

foo :: Fractional a => a 
foo = 2.0 

는 그러나, 나는 형 Eq a => a, Ord a => a의 무언가를 만드는 방법을 생각할 수 없다, 또는 숫자가 아닌 것 (undefined 사용하지 않음).

숫자가 이런 식으로 특별하다고 생각됩니다.

+1

숫자 리터럴은'fromInteger'와'fromRational'을위한 특별한 문법입니다 - 당신은'f :: Num a => .. a' 함수를 가지고 있기 때문에'Num a => a' 타입의 값을 만들 수 있습니다 (즉, fromInteger). 정확하게이 같은 사실은 다른 어떤 유형의 모형에도 적용됩니다. 'Eq' 나'Ord'를위한 함수, 즉 리턴 타입의 typeclass 인자가 없다. – user2407038

답변

6

Num이 방식으로 동작하는 유일한 의미라는 점에서 "특별"하지 않습니다. 그러나 그것은 가능하게 만드는 몇 가지 특성을 가지고 있습니다. 대신 Bounded typeclass를 고려하십시오. BoundedNum처럼하지만 Eq는 달리, 그 클래스 정의의 일환으로 유형의 값을 만들 수있는 방법을 제공하기 때문에

top :: Bounded a => a 
top = maxBound 

이 가능하다 : 유사한 기능을 정의 할 수 있도록 완벽하게 가능하다.

1

Num은 리터럴 작성을위한 특별한 구문을 가지고 있기 때문에 특별합니다. 이 구문은 내부적으로 fromInteger :: Num a => Integer -> a 함수를 사용하며 Num에 정의되어 있습니다. 컴파일러는 사용자가 작성한 내용을 Integer으로 구문 분석하고 그 결과를 fromInteger에 제공합니다.

예를 들어 Eq a => a으로 처리 할 수없는 이유는 Eq에 해당 유형의 것을 반환하는 기능이 없기 때문입니다.

이와 같은 값이 필요하다면 ExistentialQuantification 확장을 사용하여 data Equatable = forall e. Eq e => MkEquatable e과 같은 것을 사용할 수 있습니다.하지만 이는 사용자가 원하는 것이 아닐 수 있습니다. gist

+1

실존주의를 제외하고는 혼란을 야기 할 수 있으며, 보편적 인 문제이기 때문에 관련성이없는 것 같습니다. –

+0

MkEquatable에서 패턴 매칭을하면, 내부 변수의 타입은 'Eq a => a'가됩니다. 가능한지 구체적으로 물어봤을 때, 나는 모든 가능성을 커버하고 싶었습니다. – Lazersmoke

+0

확실히 그렇지 않습니다. 그렇다면'Eq' 인스턴스의 값을 다른'Eq' 인스턴스의 값으로 캐스팅 할 수 있습니다. 예 : 'MkEquatable True'는 잘 형식화되어 있으므로'unEquatable :: Equatable -> (Eq a => a); unEquatable (MkEquatable True) :: String'은 잘 유형화되었지만 분명히 난센스입니다. –

5

있습니다 더 많은 예 :

def :: Default a => a 
mempty :: Monoid a => a 
maxBound :: Bounded a => a 
toEnum 0 :: Enum a => a 
read "" :: Read a => a 
fromString "" :: IsString a => a 

이건 그냥 내 머리 위로 떨어져있다 여기

는 유형 MyClass a => a와 가치를 창출 할 수있는 타입 클래스의 예입니다 . 더 많은 것이있을 것이라고 확신합니다.

관련 문제