2013-06-21 3 views
1

GHCi에서이 정의가 실패하는 이유는 무엇입니까?왜이 간단한 산술 함수는 타입 체크를하지 않습니까?

No instance for (Num (a0 -> a0)) 
    arising from a use of `+' 
Possible fix: add an instance declaration for (Num (a0 -> a0)) 
In the expression: (* 2) + 1 
In an equation for `f': f = (* 2) + 1 

let f = (*2)+1 

방법은 다음과 다른 것이 무엇입니까?

let f x = x*2+1 
+4

'(* 2)'는 함수입니다. 'x * 2'는 숫자입니다. –

답변

6

(*2)은 기능입니다. 따라서 1을 함수에 추가하려고합니다 (함수에 대해 Num 인스턴스가없는 경우).

+0

가치가 있다고 지적하는 가치가 있습니다. 오른쪽에 얇은 것을 할 수있는 함수를위한 num 인스턴스를 정의하는 것이 었습니다. –

+0

@PhilipJF : 함수에 대한 Num 인스턴스가 있더라도'(+)'가 예상하기 때문에 여전히 유형 오류라고 생각합니다 두 인수 모두 같은 유형이어야합니다. – hugomg

+1

@missingo 그들은 그래도 될까요? 함수 ('fromInteger', baby)를 전문화 한 후에'1 :: Num a => a -> a'를 쓰면서 Num (a *) = a -> a를 호출합니다. –

8

(*2) 유형 Num a => a -> a의 기능,

let multTwo x = x * 2 

그래서 당신이 함수에 1을 추가하려는와 동일하게 정의한다.

대신 구성을 사용할 수 있습니다

다른 답변으로 당
let f = (+1) . (*2) 
+2

사실,'multTwo'는' (2 *)'가 아니라 '(* 2)'입니다. 교환 성 (commutative) 인 곱셈에서는 물론 차이가 크지 않습니다. – chirlu

+0

@chirlu - 고마워요. – Lee

2

, 당신은 함수에 1을 추가하려고하고 있습니다.

나는 당신이하고 싶은 것을 볼 수 있습니다. 무두질 '앞에'같은 :

let f = \x -> x * 2 + 1 

대통령의 대답은 당으로

let f x = x * 2 + 1 

와 동일 f = (+ 1) . (* 2)은 예상대로 모든 것을 적용한다. 다른 모든 것을 적용하려면 다음과 같이 할 수 있습니다.

import Control.Arrow 

let f = (* 2) >>> (+ 1)   

-- Prelude Control.Arrow> f 5 
-- 11 

머리 속에 생각하고있는 것보다 더 많은 부분이있을 수 있습니다.

관련 문제