2016-12-08 1 views
1

나는 하스켈에 새로운 프로그래밍이며, 다소 혼란 스럽다. 익명의 기능을 왜 카레로 만들 수 없습니까, 아니면 가능합니까?카레 익명의 함수

나는 다음과 같은 코드 조각 한 :이처럼 쓸

largestDivisible :: (Integral a) => a -> a 
largestDivisible x 
    | x <= 0 = error "NOT A VALID VALUE" 
    | otherwise = head (myFilter (f x) [x-1, x-2..1]) 
    where f x y= x `mod` y == 0 

을 때 :

largestDivisible :: (Integral a) => a -> a 
largestDivisible x 
    | x <= 0 = error "NOT A VALID VALUE" 
    | otherwise = head (myFilter (\ x y = x `mod` y == 0) [x-1, x-2..1]) 

그럼 다음과 같은 오류 나는 GHCi에로드하려고받을 경우 ,

ListStuff.hs:85:35: error: 
• Couldn't match expected type ‘Bool’ with actual type ‘a -> Bool’ 
• The lambda expression ‘\ x y -> (mod x y == 0)’ 
    has two arguments, 
    but its type ‘a -> Bool’ has only one 
    In the first argument of ‘myFilter’, namely 
    ‘(\ x y -> (mod x y == 0))’ 
    In the first argument of ‘head’, namely 
    ‘(myFilter (\ x y -> (mod x y == 0)) [x - 1, x - 2 .. 1])’ 
• Relevant bindings include 
    x :: a (bound at ListStuff.hs:83:19) 
    largestDivisible' :: a -> a (bound at ListStuff.hs:83:1) 
Failed, modules loaded: none. 
+0

왜 '필터'대신 'myFilter'를 사용 했습니까? 그리고 필자는'filter' 대신'find'를 사용하는 것이 더 적절하다고 생각합니다. – freestyle

답변

5

코드

| otherwise = head (myFilter (f x) [x-1, x-2..1]) 
where f x y= x `mod` y == 0 

x의 응용 프로그램이 여전히 남아

| otherwise = head (myFilter ((\x y -> x `mod` y == 0) x) [x-1, x-2..1]) 
                -- ^^^ 

주에 해당되는

| otherwise = head (myFilter (f x) [x-1, x-2..1]) 
where f = \x y -> x `mod` y == 0 

에 해당합니다! 익명 함수 (베타 단계)를 적용하여 더욱 단순화 할 수 있습니다.

| otherwise = head (myFilter (\y -> x `mod` y == 0) [x-1, x-2..1]) 
+0

두 번째 코드 조각 : 공백이 중요합니까? '\ x ...'또는'\ x ...'를 쓰는 데 차이가 있습니까? 좋아요, 요점이 있어요. 세 번째 코드 조각에서는 함수를 만들고 x (사용자가 표시 한 x)를 전달한 다음 목록을 전달합니다. 감사합니다! 분명히 네 번째 코드 조각은 '최고의'코드 조각입니다. –

+0

@ SparkMonkay'\ x'는'\ x'와 같습니다. '\ x y' 안의 공간은 물론 중요합니다. 그렇지 않으면'\ xy'는 변수로'xy'를 인자로 취합니다. – chi

+0

그 뜻은'\ x y z'는'\ x y z'와 같습니다. –

5

xlargestDivisible에 인수입니다 : 나는 다음과 같은 오류가 발생합니다 그러나 당신은 당신의 람다에 대한 논증으로 그것을 전달할 필요가 없습니다. 람다는 캡처 된 컨텍스트에서 x을 얻을 수 있으며 인수로 y 만 필요합니다.

첫 번째 버전은 부분 적용된 f xmyFilter으로 전달하며 첫 번째 인수는 단항 함수입니다.

두 번째 버전은 적절한 함수를 먼저 얻기 위해 부분 응용 프로그램을 사용하지 않고 두 개의 인수로 된 람다를 전달하려고 시도합니다.

첫 번째 예제와 같이 부분 응용 프로그램을 사용하거나 하나의 인수 (y)의 람다를 작성하십시오.

+0

나는 그것을 본다, 고마워. 문맥에서 x를 가져 와서 함수에 적용하지 않은 것은 슬픈 일입니다. –