2

안녕하세요, 하스켈의 고차 함수에 대한 숙제가 있습니다. 시작하는 데 약간의 문제가 있습니다.하스켈 고차 함수

첫 번째 질문에 대한 도움과 설명을 얻을 수 있다면 나머지는 끝낼 수 있다고 확신합니다.

사용 고차 함수 (map, fold, 또는 filter), 필요 람다 식을 경우, f2 같은

f1 = 
f2 = 

f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20] 것을 내가가 가지고 생각하고 기능 f1를 작성하고 [1,2,3,4][(*1),(*2),(*3),(*4)]이되도록 부분 적용 map을 사용 하시겠습니까?

+0

난 당신이 F1 GN = gn' 다음 F2 쓰기 등이'F2 (+) [1..4] 5 ='로 시작해야 말하고 싶지만 = [5,10,15,20]' – Ingo

+1

예,'f2 = map'은 좋은 생각 같습니다. – Bergi

답변

2

[1,2,3,4]가 [* 1, * 2, * 3, * 4]가되도록 부분적으로 평가 된지도를 사용해야한다고 생각합니다. 그

말했다 좋은 징조, 당신은 작업을 부여하고있는 표현이 정말 이상한되고, 그래서

f1 (f2 (*) [1,2,3,4]) 5 

내가 f1를 작성합니다

당신의 직관은, 가까운 대답을 제공합니다 당신이 f2 = map을 경우와 f2

let f1 = \xs n -> map (\f -> f n) xs 
    f2 = map 
in f1 (f2 (*) [1,2,3,4]) 5 
-- [5,10,15,20] 
+1

당신이 환상적 이길 원한다면, 'f1 = 플립 (지도. 플립 ($))':-D – Bergi

+1

당신의 대답은 아무 것도 설명하지 않습니다. – luqui

0

을 다음과 같이 IMMED 우리는

를 얻을 수

f1 [g1, g2, ..., gn] x = 
[g1 x, g2 x, ..., gn x] 

그 이후 우리가 f2 (*) [1..4]에 적용 할 수 있습니다 필요 이제 멀티 플라이어 기능의 목록을 제공

f2 (*) [1, 2, 3, 4] = 
map (*) [1, 2, 3, 4] = 
[(1 *), (2 *), (3 *), (4 *)] 

: iately 당신이 왔어요 첫 번째 단계에 도착

f1 [(1 *), (2 *), (3 *), (4 *)] 5 = 
[1 * 5, 2 * 5, 3 * 5, 4 * 5] = 
[5, 10, 15, 20] 

당신이 쫓고있는 것입니다.

f1 = \gs x -> map h gs 

지금 우리가 h가 무엇인지 알아낼 필요가있다 : 당신이 f1 보면 인수가 flip PED 있습니다 제외

, 그것은, 거의 map 것 같습니다. h(2 *)과 같은 기능을 필요로하며 해당 기능을 5에 적용한 결과를 제공합니다. 즉 h = \g -> g 5입니다.

, 우리가 얻을 모두 함께 퍼팅

let f2 = map 
    f1 = \gs x -> map (\g -> g x) gs 
in f1 (f2 (*) [1, 2, 3, 4]) 5