2012-03-07 11 views
2

私は、foldRight、foldLeftおよびunfoldだけを使ってMap関数を実装する必要があります。つまり、リスト内のすべての要素をループし、関数fを適用する必要があります。スクロールでfoldRight、foldLeft、unfoldのみを使用してマップ関数を実装する

私は次のように自分のリストを宣言している:

abstract class IntList 
case class Nil() extends IntList 
case class Cons(h: Int, t: IntList) extends IntList 

そして私はfoldRight、foldLeftを実装した機能を展開しました。

、新たなマップ機能の実装:

def map(ls: IntList, f: Int => Int): IntList = // ?? 

私は今しばらく考えてきたが、私はどこから始めの手がかりを持っていません。私はマップ関数で再帰を使用しないかもしれません。私は、折り目の力を組み合わせて一緒に展開しなければならないと確信しています。 Unfoldはマップの戻り値の型であるIntListを返します。しかし、私はこの機能で何を与えなければならないのか分かりません。

誰か手掛かりがありますか? :)

+3

ヒント:* foldLeft *または* foldRight *または* unfoldのいずれかが必要です。最も簡単な解決策はfoldRightです。 –

+0

これはかなり標準的な作業です。どのように起動するか分からない場合は、Googleにお問い合わせください。 – Marcin

+0

私はしばらくの間グーグルグーグルをしてきましたが、私はこの問題について同様の話題を見つけることはできません。私はそれが標準的な仕事であり、難しいことではないはずですが、出発点が必要なだけです。 – Devos50

答えて

2

一致する引数を入力します。例えば

あなたがfoldRightを使用しようとしている場合には、mapで返されるタイプだから、その後Bは、IntListでなければなりません。タイプに一致する値を持つ任意の値をfoldRightに入力してください。 [前のコメントへの返信で。]

+0

ええと...ジェネリック型についていくつか調べてみましたが、今はどのように動作しているのか分かりました。次のような仕事がありますか?この場合、BはIntList型である: MyList.foldRight as、Nil()、(x:Int、y:IntList)=> Cons(f(x)、Nil()) – Devos50

+3

@ Devos50 REPLのように見える?やってみて!それはあなたを噛まないでしょう。 :-) –

+0

Hehe、確かに、私はいくつかのテストを書いて、私はそれを持っていると思います:) MyList.foldRight(as、Nil()、(x:Int、y:IntList)=> Cons(f x)、y)) Nil()をyで置き換える必要がありました。そうでないと、最初の呼び出しで再帰が既に停止していたからです。私はこれらのジェネリックタイプにもっと精通していなければなりません。 コメントをいただきありがとうございました。 :) – Devos50

1

私はあなたが与えられる展開の正確な変種分かりません。

(* unfold : ('a -> ('b * 'a) option) -> 'a -> 'b list *) 

let rec unfold f x = 
    match f x with 
    | None -> [] 
    | Some (y, x') -> y :: unfold f x' 

その後mapのためのソリューションは以下の通りです:

let map f = unfold (function [] -> None | x::xs -> Some (f x, xs)) 

希望に役立つこと、それは、この(OCamlでは、申し訳ありませんが、Scalaは今インストールされていない)のようなものだと仮定。

+0

ありがとうございます。 OCamlコードを解読する時間がありました。私の問題はdef defold(A、B)の代わりにOPのdef(Int:Int => Option(Int、Int)、x:Int):List [Int] ](f:A =>オプション(B、A)、x:A):リスト[B] '。 – ziggystar

+0

私と同じです。 「アンフォールディング」の実装に関する何かが間違っているか混乱していましたが、もう一度それを読むと正しいと思われます。奇妙な。 –

関連する問題