2017-12-27 15 views
-4

누군가에 데이터를 공급하는 방법으로 날 포인트 :수유 데이터 7

twice f x = f (f x) 
그것은 에릭 마이어의 강연에서 가져온 것

, 나는 오직 진정으로 내가 할 수있는 느낌이 데이터를 전달할 때 이해합니다. 이제는 오류 만 발생합니다.

+1

."오류에서 지금이 결과 만 "-> 무엇을 당신은 무엇을 시도 했습니까? 어떤 오류가 있습니까? – Ryan

+4

입니다 추가

#define eighthRoot(x) (sqrt(sqrt(sqrt(x)))) printf ("eigthtRoot(16) = %f \n", eighthRoot(16)); 
gallais

+0

아마도'once fx = fx'와 비교 될 것입니다.'once'는'($)'의 철자가 더 자주 쓰이며'f = f. f' 또는' '2 회 = join (.)' – chepner

답변

2

파생 형식 서명은 (t -> t) -> t -> t입니다. 일치하는 모든 인수를 전달하면 컴파일러 오류가 발생하지 않습니다. 한 예로는 twice (+1) 0입니다.

1

여기서 가장 큰 실수는 twice 유형을 무시한 것입니다. 하스켈에서는 타입이 매우 중요하며, 그러한 함수를 호출하는 방법을 정확하게 설명합니다. 호출자가 호출자가 인수를 전달하는 호출자가 유형 a -> a

  • 의 기능 f을 전달
  • 을 원하는 a 모든 유형을 선택

    • :

      twice :: (a -> a) -> a -> a 
      

      그래서, 함수는이 방식으로 작동합니다 타입이 a

    • twice이 최종적으로 a

    따라서 다음을 수행 할 수 있습니다. 예를 들어 a = Int을 선택할 수 있습니다. 그런 다음 10x :: Int을 선택

    myFun :: Int -> Int 
    myFun y = y*y + 42 
    

    로 기능 f을 정의합니다. 마지막으로, 우리는

    twice myFun 10 
    

    대안으로 전화를 걸 수 있습니다, 우리는 람다를 사용하고 동일한와 여기에 세 가지 기능이 erik1라고 그림, erik2 및 erik3를 들어

    twice (\y -> y*y + 42) 10 
    
  • 0

    위의 함수 정의를 건너 뛸 수 있습니다 형식 서명.

    erik1, erik2, erik3 ::(a -> a) -> a -> a 
    erik1 f x = f x 
    erik2 f x = f(f x) -- Equivalent to "twice" 
    erik3 f x = f(f(f x)) 
    

    이 에릭은 두 개의 인수를 취합니다. 첫 번째는 함수이고 두 번째는 숫자입니다. 함수로 sqrt를 선택하고 16으로 숫자를 선택하고 세 개의 에릭을 실행 해 봅시다. 여기에 당신이 무엇을 얻을 :

    같은 erik3 같은 당신이 시도 할 수있는 많은 일들이있다
    *Main> erik1 sqrt 16 
    4.0 
    *Main> erik2 sqrt 16 
    2.0 
    *Main> erik3 sqrt 16 
    1.4142135623730951 
    

    (/ 2) 16 = 2, 함수의 F 당신이 적절한 기능을 사용할 수 있기 때문이다.

    printf ("Eighth root of 16 = %f \n", sqrt(sqrt(sqrt(16)))); 
    

    Dr. Meijer Ch 7 1시 48분 에릭 유형 서명을 쓸 때 나는 지난 밤에 핵심이 이루어진이 강의를 보면서 3시 37분 에 : SQRT의 특정 경우, erik3는 C에서이 문에 해당 두 번 : (a -> a) -> (a -> a)라고 말하면서 "두번은 a를 받아 a로부터 새로운 함수를으로 되 돌리는 함수이고, 2 배가 더 높은 차수 함수라는 것이 고통스럽게 명백해진다."

    는 것을 보여주는 가까이 오는

    AC 예제 입니다 :.

    2-1 두 번 두 번`(1+) 2`