3

Haskell の高階関数の宿題があり、少し手こずっています。

最初の質問で助けと説明を得ることができれば、残りを終わらせることができると確信しています.

高階関数 ( mapfold、またはfilter) を使用し、必要に応じてラムダ式を使用f1f2て、f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]

f1 = 
f2 = 

私は部分的に適用されたものを使用しなければならないと思ってmap[1,2,3,4]ます[(*1),(*2),(*3),(*4)]

4

2 に答える 2

3

[1,2,3,4] が [*1,*2,*3,*4] になるように、部分的に評価されたマップを使用する必要があると考えています??

あなたの直感が答えに近づくので、それは良い兆候です

とはいえ仕事で与えられた表情は本当に変です

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

f1私は次のように書きf2ます

let f1 = \xs n -> map (\f -> f n) xs
    f2 = map
in f1 (f2 (*) [1,2,3,4]) 5
-- [5,10,15,20]
于 2016-12-06T18:00:49.033 に答える
1

を選択するf2 = mapと、思いついた最初のステップにすぐにたどり着きます。

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

この乗数関数のリストを考えると、次のものが必要です。

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

それ以来、それを適用しf2 (*) [1..4]て取得できます

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

それはあなたが求めているものです。

を見ると、引数がpedであることを除いて、f1ほぼ のように見えます。mapflip

f1 = \gs x -> map h gs

今、私たちは何が何でhあるかを理解する必要があります. 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
于 2016-12-21T01:59:42.670 に答える