2011-11-19 2 views
7

에서 람다 기능을하고있어 재사용하는이 코드를 취할 :내가 생각 하스켈

f x y z = x^3 - g (x + g (y - g z) + g (z^2)) 
where g x = 2*x^2 + 10*x + 1 

을 어디없이 다시 (또는하자).

그들은 람다 함수를 작성하는 의미 (\ X -> ...) 나는 하스켈에 람다 기능을 재사용하기 위해 노력하고있어

. 어떤 아이디어?

+6

'F = 플립 플립 ((1 +) AP ((+). (2 *). (^ 2)) (10 *)). (뒤집기.). 플립 플립 (플립 ID. (^ 2)). (liftM2 (liftM2()). (+))': f는 람다 본 (lambdabot)에 의해 무의미 해졌습니다. (+)).) (.) (. (ap id.). – fuz

답변

12

, 당신은 다음과 같은 방법으로 람다를 사용하여 비 재귀 let를 다시 작성할 수 있습니다 :

let x = A in B  ==>  (\x -> B) A 
x 변수이다

AB 표현식이다.

+5

이 트릭에 대해 재미있는 점은 자바 스크립트에서 실제로 표준 연습이라는 것입니다 함수 만 스코프 블록을 도입 할 수 있기 때문입니다. – hugomg

+1

아직도 재사용 할 수있는 방법을 잘 모르겠다. – Asaf

+0

@Asaf :'B'에서'x '를 여러 번 참조 할 수있다. 예를 들어'(\ x -> x + x) 3 '을 취합니다. 이것은 '3 + 3'과 동일하지만 단 한 번만'3'을 쓰면됩니다. – hammar

8

무언가를 재사용하려면 무언가를 주장 할 수 있습니다.

2

나는 의도가 bravit에서 암시한다고 생각합니다.
근질 따라 - 더 - 문자 - 중 - 법률 해결 방법이 caseg을 구속력)에서 bravit 힌트로

+2

또 다른 smartypants 솔루션은'f'에서 아무 것도 닫히지 않기 때문에'g'를 최상위 함수로 만들 것입니다 : – hammar

2

해머와 브레이트의 힌트를 확장하려면 솔루션에 람다 한 개만 필요하지는 않지만 두 개 중 하나는 g과 같이 많이 보일 것이며 다른 하나는 두 번째와 같이 크게 보일 것입니다. 람다 계산법 g를 사용 f

1

의 절반은 (\x -> 2*x^2 + 10*x + 1)

그래서 당신이 f x y z = x^3 - g (x + g (y - g z) + g (z^2))

$> echo "f x y z = x^3 - g (x + g (y - g z) + g (z^2))" | sed -r -e 's/g/(\\x -> 2*x^2 + 10*x + 1)/g' 
f x y z = x^3 - (\x -> 2*x^2 + 10*x + 1) (x + (\x -> 2*x^2 + 10*x + 1) (y - (\x -> 2*x^2 + 10*x + 1) z) + (\x -> 2*x^2 + 10*x + 1) (z^2)) 

에두고 g을 대체 할 필요가있다 난 농담이야, 미안해.

+3

나는 그의 강사가 그 대답에 대해 흥분하지 않을 것이라고 확신한다;) – Nate

+1

이것은 정확하게 대답 할 것이다. 내가 아는 한,이 질문은 "여기,이 관용적 인 코드를 사용하여 그것을 더 악화시킨다, 단지 당신이 X를 안다는 것을 증명하는 것"으로 귀결된다. 교사가 내가 X를 안다면 X가 실제로 유용하고 필요한 질문을 제기해야합니다. –

-1

그 질문은 다소 호기심이 많고 흥미로운 것 같습니다. 그래서, 나는 람다 미적분학이 무엇인지 알아 내려고 해답을 찾고 그것을 OP에 보여주고 싶습니다. (모든 힌트는 이미 실제로 보여졌습니다. 스포일러 경고). 기능과 3 개의 숫자를 얻고 답을 반환

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) 
f :: 
    (Integer -> Integer) -> Integer -> Integer -> Integer -> Integer 

그래서, 우리가있어 기능을, :

첫째, f를 재정의하려고 할 수 있습니다. 우리가 f_new = f g처럼, 바로 여기 g 정의를 추가 할 수 있습니다 curring 사용 : 우리는 완료

λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1) 
f :: Integer -> Integer -> Integer -> Integer 

. 확인해 보겠습니다.

답변은 정확합니다.

UPD : 이들 실시 예 let에서

인터프리터 함수를 선언하는 단순한 방식이기 때문에, 최종 답변입니다.

f :: Num a => a -> a -> a -> a 
f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)