2012-02-05 5 views
1

이 코드의 문제점은 무엇입니까?하스켈 고차 함수 도움 필요

addNum :: Int->Int-> Int 
addNum a b = a+b 

divideby :: (Int->Int -> Int) -> Int ->float 
divideby f z = f /z 

는 I는 제수에 출력 환불 divideby에 입력으로서 addNum 기능을 원한다. 따라서 divideby 함수는 고차 함수로 작동해야합니다.

이 코드의 문제점은 무엇입니까? 다음과 같은 오류가 발생합니다 :

*** Expression  : f/z 
*** Term   : f 
*** Type   : Int -> Int -> Int 
*** Does not match : Int 

답변

6

정확하게 오류의 의미입니다. 당신은 당신의 기능 유형이

의미
divideby :: (Int->Int -> Int) -> Int ->float 

는 첫 번째 인수는 유형 Int->Int -> Int와 함수해야이라고 규정 한 두 번째 입력은 Int해야하며, 다음은 float를 생성합니다. 당연히, Haskell은 함수를 Int로 나눌 방법을 모른다. 이것은 당신이 식을 사용하여 그것을 말하고있는 것이다.


댓글에 대한 응답으로 : no. 이것은 고차원 함수가 아니지만 가까운 것입니다. 살펴 보자

addNum :: Int -> Int -> Int 
addNum a b = a + b 

divideBy :: Int -> Int -> Int -> Int 
divideBy a b c = (addNum a b) `div` c 

divideBy 입력으로서 3 개 Int의 소요 및 Int을 생성하는 함수이다. 그 입력은 단지 Int이기 때문에 이 아니고 고차 함수 인이 아닙니다. 그러나 addNum의 사용을 입력으로 추상화하여 고차 함수로 만들 수 있습니다. addNum 우리가 이미 가지고있는 입력에 더하여, 우리는 우리의 첫 번째 입력

divideBy :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int 
divideBy f a b c = (f a b) `div` c 

의 종류는 제대로 컴파일하고 의미가 고차 기능이라고 할 것입니다, (Int -> Int -> Int) 입력이 있으므로 . :) addNum을이 함수의 입력으로 전달할 수 있습니다.

ghci> divideBy addNum 2 4 6 -- (2 + 4)/6 
1 
+0

이 정확한가요? 이것은 고차 함수입니까? {addNum :: Int-> Int-> Int addNum a b = a + b divideby :: Int-> Int-> Int-> a divideby a b c = (addNum a b)'div' c} – user1150071

1

는 (있는 거의 확실히 대신 Double을 원하는), 후자는 구체적인 유형, 전자는 형태 변수입니다 ... floatFloat 차이가있다.

이것은 Dan Burton의 답변과 관련이 있습니다. 우선

1

i want to take addNum function as a Input in to divideby function with divide factor and then output the answer.

divideby 함수는 숫자 2 및 fz 소요 f/z를 반환하는 함수이다. Dan Burton이 말했듯이, divideby 함수가 두 개의 division을 반환하면 Int -> Int -> Int을 인수로 사용할 수 없습니다.

는 그래서 수있는 다음과 같습니다

divideby :: Int -> Int -> Float 
divideby f z = (fromIntegral f)/(fromIntegral z) 

당신이 divideby의 첫 번째 인수로 addNum의 결과를 측정처럼, divideby의 중첩 및 addNum와 같은 일부 기능을 구성하려는 경우, 당신이 그런 식으로 작업을 수행 할 수 있습니다 :

newFunction :: Int -> Int -> Float 
newFunction a b = divideby (addNum a b) b 

실제로는 (a+b)/b과 같습니다.