에서 람다 기능을하고있어 재사용하는이 코드를 취할 :내가 생각 하스켈
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 -> ...) 나는 하스켈에 람다 기능을 재사용하기 위해 노력하고있어
. 어떤 아이디어?
에서 람다 기능을하고있어 재사용하는이 코드를 취할 :내가 생각 하스켈
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 -> ...) 나는 하스켈에 람다 기능을 재사용하기 위해 노력하고있어
. 어떤 아이디어?
, 당신은 다음과 같은 방법으로 람다를 사용하여 비 재귀 let
를 다시 작성할 수 있습니다 :
let x = A in B ==> (\x -> B) A
x
변수이다
및 A
및 B
표현식이다.
무언가를 재사용하려면 무언가를 주장 할 수 있습니다.
나는 의도가 bravit에서 암시한다고 생각합니다.
근질 따라 - 더 - 문자 - 중 - 법률 해결 방법이 case
와 g
을 구속력)에서 bravit 힌트로
또 다른 smartypants 솔루션은'f'에서 아무 것도 닫히지 않기 때문에'g'를 최상위 함수로 만들 것입니다 : – hammar
해머와 브레이트의 힌트를 확장하려면 솔루션에 람다 한 개만 필요하지는 않지만 두 개 중 하나는 g
과 같이 많이 보일 것이며 다른 하나는 두 번째와 같이 크게 보일 것입니다. 람다 계산법 g
를 사용 f
의 절반은 (\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을 대체 할 필요가있다 난 농담이야, 미안해.
나는 그의 강사가 그 대답에 대해 흥분하지 않을 것이라고 확신한다;) – Nate
이것은 정확하게 대답 할 것이다. 내가 아는 한,이 질문은 "여기,이 관용적 인 코드를 사용하여 그것을 더 악화시킨다, 단지 당신이 X를 안다는 것을 증명하는 것"으로 귀결된다. 교사가 내가 X를 안다면 X가 실제로 유용하고 필요한 질문을 제기해야합니다. –
그 질문은 다소 호기심이 많고 흥미로운 것 같습니다. 그래서, 나는 람다 미적분학이 무엇인지 알아 내려고 해답을 찾고 그것을 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)
'F = 플립 플립 ((1 +) AP ((+). (2 *). (^ 2)) (10 *)). (뒤집기.). 플립 플립 (플립 ID. (^ 2)). (liftM2 (liftM2()). (+))': f는 람다 본 (lambdabot)에 의해 무의미 해졌습니다. (+)).) (.) (. (ap id.). – fuz