2017-10-18 1 views
-1
내 프로그램에서이 오류를 받고있다

:하스켈 FORALL 오류 불법 기호

Illegal symbol '.' in type 
    Perhaps you intended to use RankNTypes or a similar language 
    extension to enable explicit-forall syntax: forall <tvs>. <type> 

내 프로그램은이 :

ex31 :: Eq a => [a] -> [a] 
ex31 [] = [] 
ex31 (h:t) = complementar 0 (h:t) 

complementar :: forall a. Eq a => Int -> [a] -> [a] 
complementar _ [] = [] 
complementar x (h:t) = if (x/2) == div x 2 
         then complementar (x+1) t 
         else h : complementar (x+1) t 
+6

당신이 조언을 다음과 같은 시도 해 봤나은? :)'{- # LANGUAGE RankNTypes # -}'를 파일 상단에 추가하십시오. – Alec

+5

이 특별한 경우에,'forall a. '. 'ScopedTypeVariables'도 가능합니다. (하지만 다른 오류가 있는데, 'Int'에'/ 2 '를 사용하는 것과 같다) – chi

답변

1

표준 하스켈은 당신이하려고하는 forall 구문을 지원하지 않습니다 용도. 이를 사용하려면 RankNTypes과 같은 언어 확장을 사용하도록 설정해야합니다. 이 이러한 확장을 가능하게하는 방법은 여러 가지가 있지만 가장 간단한이 같은 소스 파일의 상단에 줄을 추가하는 것입니다

대화 형 프롬프트에서 GHCi에서
{-# LANGUAGE RankNTypes #-} 

, 당신은 할 수 있습니다 :

> set -XRankNTypes 
당신이 쓴 이유는이 경우

그러나, 나는 확실하지 않다 :

complementar :: forall a. Eq a => Int -> [a] -> [a] 

이 쓰기에 해당 이후 :

complementar :: Eq a => Int -> [a] -> [a] 

표준 Haskell 구문이며 확장 할 필요가 없습니다.

다른 문제는 x이 짝수인지 여부 (즉, (x/2) == div x 2 표현식)가 하스켈에서 작동하지 않는다는 것입니다. 나누기 연산자 "/"은 정수와 함께 작동하지 않으므로 x을 먼저 부동 소수점으로 변환해야합니다.

이 경우에는 작동하지만 일반적으로 부동 소수점 수의 동등성에 기반한 테스트는 까다 롭고 피해야합니다. 당신은 음수를 처리해야하는 경우 (

> 10 `rem` 2 == 0 
True 
> 7 `rem` 2 == 0 
False 
> 

: 하나의 정수가 또 다른로 나누어 경우 확인의 더 표준적인 방법은 정수 나누기 후 나머지가 0 인 경우는 rem 기능을 사용 할 수있는, 보는 것입니다 , 당신은하지만, remmod의 차이를 조사해야 할 수도 있습니다)

을이 특정한 경우에, 당신이 사용할 수있는 라이브러리 함수가 다음과 같습니다.

> even 10 
True 
> even 7 
False 
>