누군가에 데이터를 공급하는 방법으로 날 포인트 :수유 데이터 7
twice f x = f (f x)
그것은 에릭 마이어의 강연에서 가져온 것
, 나는 오직 진정으로 내가 할 수있는 느낌이 데이터를 전달할 때 이해합니다. 이제는 오류 만 발생합니다.
누군가에 데이터를 공급하는 방법으로 날 포인트 :수유 데이터 7
twice f x = f (f x)
그것은 에릭 마이어의 강연에서 가져온 것
, 나는 오직 진정으로 내가 할 수있는 느낌이 데이터를 전달할 때 이해합니다. 이제는 오류 만 발생합니다.
파생 형식 서명은 (t -> t) -> t -> t
입니다. 일치하는 모든 인수를 전달하면 컴파일러 오류가 발생하지 않습니다. 한 예로는 twice (+1) 0
입니다.
여기서 가장 큰 실수는 twice
유형을 무시한 것입니다. 하스켈에서는 타입이 매우 중요하며, 그러한 함수를 호출하는 방법을 정확하게 설명합니다. 호출자가 호출자가 인수를 전달하는 호출자가 유형 a -> a
f
을 전달a
모든 유형을 선택
twice :: (a -> a) -> a -> a
그래서, 함수는이 방식으로 작동합니다 타입이 a
twice
이 최종적으로 a
따라서 다음을 수행 할 수 있습니다. 예를 들어 a = Int
을 선택할 수 있습니다. 그런 다음 10
로 x :: Int
을 선택
myFun :: Int -> Int
myFun y = y*y + 42
로 기능 f
을 정의합니다. 마지막으로, 우리는
twice myFun 10
대안으로 전화를 걸 수 있습니다, 우리는 람다를 사용하고 동일한와 여기에 세 가지 기능이 erik1라고 그림, erik2 및 erik3를 들어
twice (\y -> y*y + 42) 10
위의 함수 정의를 건너 뛸 수 있습니다 형식 서명.
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`
."오류에서 지금이 결과 만 "-> 무엇을 당신은 무엇을 시도 했습니까? 어떤 오류가 있습니까? – Ryan
입니다 추가
– gallais아마도'once fx = fx'와 비교 될 것입니다.'once'는'($)'의 철자가 더 자주 쓰이며'f = f. f' 또는' '2 회 = join (.)' – chepner