2011-05-13 2 views
5

하스켈에서 === 사이의 차이점을 해결하는 데 여전히 문제가 있습니다. 나는 전자가 오버로드 된 타입과 관련이 있고 후자가 함수의 결과를 준다는 것을 알고 있지만, 나는 그저 내 머리를 감당할 수 없다. 어떤 도움이라도 대단히 감사 할 것입니다.하스켈에서 ==와 =의 차이

+0

주를 반환 일반적으로 infixed 함수, 수있는 함수가 아닙니다 .얼랭 (Erlang)은 특히 다른 언어가 사용하는 곳에서'='를 사용합니다.'==' –

답변

15

=은 "정의 됨"을 의미하는 하스켈의 특별 예약 기호입니다. 정의를 소개하는 데 사용됩니다. 즉, 다른 값과 함수의 정의에서 참조 할 수있는 새 값과 함수를 만드는 데 사용합니다.

==은 예약 기호가 아니며 Eq a => a -> a -> Bool 유형의 기능입니다. type class (Eq)으로 선언되는 경우도 있지만 예외는 없습니다. 기본 제공 선언 인 ==을 숨기고 원하는대로 다시 정의 할 수 있습니다. 그러나 일반적으로 "동일 함"을 의미하고 유형 클래스의 일부이기 때문에 특정 유형에 대해 "평등"을 의미하도록 원하는 것을 의미하도록 (과부하) 정의 할 수 있습니다. 예를 들어

: 나는 Foo에 대한 ==을 정의하는 =을 사용

data Foo = Foo Int 

instance Eq Foo where 
    (Foo x) == (Foo y) = x == y 

주의! 차분 생각할

간결한 방법 =런타임시 어떤지 ==검사하는 반면, 컴파일시 평등 주장이다.

1

== 평등을위한

예입니다 = 비교하는 두 개의 정수

할당

예를 : 나는 아직 꽤 하스켈 전문가가 아니에요 변수

+5

"할당"이라는 단어를 "정의"라고 사용합니다. 'x = 4'는 'x가 4로 정의 됨'을 의미합니다. 할당은 그 일이 언제 일어날 것인가를 암시하기 때문에 중요합니다. – luqui

1

의 정수를 할당 그러나 대부분의 다른 언어에서와 마찬가지로 ==true 또는 false을 산출하는 비교 연산자이고 =은 하스켈에서 할당 연산자입니다 함수 선언.

ghci> 5 == 5 
true 
ghci> "foo" == "bar" 
false 
ghci> let foo = "bar" 
1

==는 두 항목이 같은지 비교하는 연산자입니다. "Eq a => a -> a -> Bool"타입의 꽤 일반적인 haskell 함수입니다. 이 유형은 Eq typeclass를 구현하는 모든 유형의 값에서 작동하므로 과부하 상태입니다.

반면에 =는 정의를 소개하는 데 사용되는 대입 연산자입니다.

2

=은 할당을 수행합니다. 또는 정의는 아마 더 나은 단어입니다. 한 번만 할 수 있습니다. 이것은 특별한 연산자/기호입니다. 그것은

==이 typeclass Eq의 두 개의 입력을 받아 부울에게 많은 언어뿐만 아니라 하스켈은 약간 이러한 연산자에 대한 정의를 변화 한 것을

Prelude> let a = 1 
Prelude> a 
1 
Prelude> 5 == 5 
True 
Prelude> 5 == 6 
False 
Prelude> :t (==) 
(==) :: (Eq a) => a -> a -> Bool