>
== 를 사용하여 두 가지를 비교하는 함수가있을 때  비교 연산자 Eq a => a... 와 같은 것을 추가합니다  형식 선언에;그러나 항상 그런 것은 아닙니다.

예를 들어, 다음 기능이 주어진다면 :

tail' xs = if length xs == 0
          then []
          else drop 1 xs

우리는 == 를 사용합니다  비교 연산자이므로 올바른 유형의 decalaration은 다음과 같습니다.

tail':: (Eq a) => [a] -> [a]

그러나, pyzwyz를 실행  올바른 유형 데칼은 다음과 같습니다.

:t tail'

이런 이유는 무엇입니까? 왜 tail':: [a] -> [a] 하지 않습니까  형식 선언에 필요합니까?

Eq
  • 답변 # 1

    Eq a => t  그 a 를 말한다   Eq 의 인스턴스 여야합니다   t 유형 . Eq 의 인스턴스 인 타입  그 == 의미  해당 유형에 대해 정의됩니다. 그러나 tail' 의 정의에서 , 당신은 == 를 사용하지 않습니다   a 에 프록시조차도 아닙니다. == 의 실제 사용   length xs == 0 에 있습니다 . length xs 의 유형  (그리고 0 )는 Int 입니다 및 Int  이미 Eq 의 인스턴스입니다 그래서 우리는 이미 == 가 있다는 것을 알고 있습니다.  한정된. == 를 사용하지 않기 때문에   a 에 , 당신은 Eq a 가 필요하지 않습니다  구속 조건.

    그러나 xs == [] 라고 말한 경우 , 이는 목록이 비어 있는지 테스트하여 동일하게 보입니다 . Eq a 가 발생했을 것입니다.  강제. == 때문입니다   [a] 에서   Eq a 가 필요합니다   == 를 사용하기 때문에 제한  각 목록의 항목에서 목록을 비교하십시오. length xs == 0 를 사용할 수 있기 때문에  (또는 더 나은, null xs ),이 추가 된 제약은 의심스럽고 피해야합니다.

    (제쳐두고, drop 1 [] = []  그래서 당신은 당신의 if 가 필요하지 않습니다 , 그러나 이것은 질문과 관련이 없습니다.)

  • 이전 adafruit - Python/Micropython에서 ADS1114와 함께 ADS1x15 라이브러리 사용
  • 다음 java - Spring 싱글 톤 Bean에서 개인 메소드를 정적으로 만드는 이유가 있습니까?