5

ある種の「初心者向け ML」ガイドを探しています。これまでのところ、Google のおかげで、あいまいなメーリング リストや頭のおかしいテキストにたどり着きました。

問題は、これまで関数型プログラミングの経験がまったくなく、概念に頭を悩ませることが、予想よりもはるかに困難であることが判明したことです。たとえば、私が今やろうとしているタスク (はい、大学 :)) は、2 つのリスト (a,b) と (c,d) の間のマッピングを行うことで、結果は (a,d) のリストになります) b = c のペアから。

私が通常行うことは次のとおりです。

result = []
for each x in list1 do
  for each y in list2 do
    if x.b == y.c result.add (x.a, y.d)
  end
end

しかし、私はそのようなものを SML で実装することを始めることさえできません。たとえば、ネストされたリストを反復処理できることを知っていますmap f list。ただし、ランタイム (SML/NJ) は、パラメーターとしてリスト要素のみを取る関数に対してのみこれを受け入れます。しかし、一度に 2 つのリストの 1 つしか操作できない場合、どの要素を返す必要があるかを知るにはどうすればよいでしょうか?

私は、この種のことを、できれば大きな親しみやすい文字と多くのコード例で説明するリソースを切実に必要としています:/

4

6 に答える 6

8

Programming in Standard ML by Prof. Robert Harper of CMU

于 2010-07-09T14:34:43.773 に答える
2

複数の個別のリストを再帰するのは面倒です(もちろん、この演習ではそれが必要かもしれません)-通常、両方から単一のリストを作成する方が簡単です(「並べて」、この場合、各エントリにはペアがあります整数の) そして、それをマップまたはフォールドします。ML には「zip」のような関数が含まれているのではないかと思います。

また、現時点であなたが探しているものではありませんが、優れた ML の本 (実際には OCaml の方言ですが、SML とそれほど変わらないほど古いものです) が必要な場合は、Cousineau + Mauny を参照してください。休日に時間があればいいのですが。これは非常に優れた本です。SICP に少し似ていますが、ML 向けです。

于 2009-11-08T21:09:05.393 に答える
2

あなたが言及した演習についてはadd、既存のリストを変更する代わりに新しいリストを返す関数を考えてください。そして、最初のステップとなるお気に入りの高級言語で演習を再帰的に実装する方法を検討してください。

mapまたは他の既存の高次 ML 関数を使用する必要はありません。これらは、経験豊富なプログラマー向けの単なるショートカットです。パターン マッチングと再帰のみを使用します。mapただし、よく使用される再帰やパターン マッチングの例を探す場合など、関数の実装を見ることができます。

于 2009-11-08T20:34:42.057 に答える
0

次の map2 のコードを考えてみましょう。この関数は map とまったく同じことを行いますが、2 つのリストを使用します。

exception UnequalLengths;

fun map2(f,[],[]) = []
  | map2(f,(a::s),(a'::s')) = 
    (f(a,a'))::(map2(f,s,s'))
  | map2(f,s,s') = raise UnequalLengths;

fun plus(x,y) = x + y;
fun concat(s1,s2) = s1 ^ s2;

これで、次のように使用できます。

- map2(plus,[1,2,3],[4,5,6]);
val it = [5,7,9] : int list
- map2(concat,["a","b","c"],["d","e","f"]);
val it = ["ad","be","cf"] : string list

XDをお楽しみください

于 2012-02-11T13:38:21.553 に答える
0

カリー化とは何か理解していますか?

たとえば、次の違いを理解していますか?

fun compute(m,b,x):real = m*x+b ;

fun linearF (m,b) x : real = m*x+b ;

もしそうなら、あなたは何を説明できますか

val g = linearF(1.0,~1.0) ;

しますか?

カリー化は、問題を解決するために厳密に必要というわけではありませんが、関数型プログラミングでよく使用される手法です。特に、必要に応じて List.map を使用する方法を提供します。ここでは、list1 にマップしたいのですが、使用したい関数は list2 と計算結果について知る必要があります。これは、コードが形状を持っている可能性があることを示唆しています

List.map (f [] list2) list1

ここで、f は適切に定義されたカリー関数です。一般に、これは、 List.mapのような理由で「1 つの引数」関数である必要がある関数に、より多くの情報を提供するための便利なトリックです。

これは役に立ちますか?

于 2010-09-19T01:08:49.913 に答える