2013-10-31 2 views
0

, 나는이 시도. 나는 하스켈하는 초보자입니다반복 기능 N 시간 오류 하스켈

[1 of 1] Compiling Main    (pad.hs, interpreted) 

pad.hs:2:8: 
    Could not deduce (Eq n) arising from the literal `0' 
    from the context (Num n) 
     bound by the type signature for 
       multi :: Num n => n -> (a -> a) -> a -> a 
     at pad.hs:1:8-35 
    Possible fix: 
     add (Eq n) to the context of 
     the type signature for multi :: Num n => n -> (a -> a) -> a -> a 
    In the pattern: 0 
    In an equation for `multi': multi 0 f x = x 

pad.hs:3:23: 
    Could not deduce (Num ((a -> a) -> a -> a)) 
     arising from a use of `-' 
    from the context (Num n) 
     bound by the type signature for 
       multi :: Num n => n -> (a -> a) -> a -> a 
     at pad.hs:1:8-35 
    Possible fix: 
     add an instance declaration for (Num ((a -> a) -> a -> a)) 
    In the expression: multi n - 1 
    In the expression: (multi n - 1) f (f x) 
    In an equation for `multi': multi n f x = (multi n - 1) f (f x) 
Failed, modules loaded: none. 

: 는 ghci에서 나는 이것을 얻었다. 나는 무엇을해야합니까?

답변

2

거의 했어요.

(multi 0) f x=x 
(multi n) f x=(multi (n-1)) f (f x) 
+0

매우 간단합니다. 다른 질문은 코드에 포함되어 있지만 'n-1'대신 '(n-1)'을 사용한다고 명시 적으로 말한 유일한 사람입니다. – PyRulez

4

커플 일 : 최소한의 수정 n - 1 괄호를 추가하고 서명을 제거하는 것입니다. Num에서 동등 함을 확인할 수 없습니다. 당신은 아마 Int을 찾고 있습니다. 둘째 당신은 멀티 주위에 흉막이 필요없고 그것은 논쟁의 대상입니다. 그리고 다른 포맷.

multi :: Int -> (a -> a) -> a -> a 
multi 0 f x = x 
multi n f x = multi (n-1) f (f x) 

당신은 이러한 유형의 서명이 더 일반적인 만들 수 있지만, 우리는 그냥 막대기 것입니다. 하지만 당신은 고차원 함수로이 모든 것을 쓸 수 있습니다. 나는 그것이 컴파일하게 프로그램을 만들 수 있습니다

multi :: Int -> (a -> a) -> a -> a 
multi n f a = foldl (\v _ -> f v) a [1..n] 
+0

두 번째 구현에서는 폴드 레이더가 더 게으르지 않습니까? – cheecheeo

2

작은 변화는 다음과 같습니다

multi::(Eq n, Num n)=>n->((a->a)->(a->a)) 
(multi 0) f x=x 
(multi n) f x=(multi (n-1)) f (f x) 

Num 형 클래스는 이미 Eq의 멤버로 멤버를 필요로하지 않는다, 그래서 우리는 지정해야 그뿐 아니라. 또한 n-1을 인수로 multi에 전달하려고합니다.

이 문제는 보통 하스켈 랜드에서 iterate!!으로 이루어집니다.

1

여기 몇 가지 문제가 있습니다.

Num n은 typeclass 정의에 제약이 없음을 의미하는 Eq n을 의미합니다. 0에서 패턴 일치를 수행하려면 의 인스턴스로 n 유형이 필요합니다. 나는이 코드를 명시 적으로 Int으로 바꿀 것이므로이 코드에서 추가 일반성을위한 이유는 없습니다.

다음, (multi n-1) 나는 또한 코드를 정리하고 오른쪽 장소에 괄호를 넣어했습니다 .B 다음 1을 빼고 multin에 적용됩니다.

multi:: Int -> (a -> a) -> a -> a 
multi 0 _ x = x 
multi n f x = multi (n-1) f (f x) 

Cirdec points out로서 당신은 iterate f a !! n이 작업을 수행 할 수 있습니다.

편집 :

무엇을 당신이하려는 것은 f는이 같은 작업을 수행 할 수 있습니다 n 시간을 적용하는 기능을 얻을 경우

. 10n(1+)으로 바꿔서 원하는 기능을 반복하십시오.(또는 일부만 적용하십시오 multi)

let f = foldr1 (.) (take 10 $ repeat (1+)) 
+0

http://pastebin.com/ECrSKmYT – PyRulez

+0

또한 개념적으로는 "함수 곱하기"라고 생각합니다. 그런 다음이 함수를 정의합니다. 만약 내가 그것을 사용한다면, 그것은 단지 반복 된 함수를 전달할 것입니다. – PyRulez

+0

오류 메시지의 줄이 잘못되었습니다. '(multi n - 1)'은'n '에'multi'를 적용한 다음 결과에서'1'을 뺍니다. 즉 부분적으로 적용된 함수에서 1을 뺀다. 내가'multi (n-1)'로 바꿨음을 주목하라. – asm