私はSMLで関数を定義する2つの方法があることに気付きました。アドイン機能を取る場合例えば、これらは2つの方法があります。 :秒1のように、関数型を作成し val add = fn : int -> int -> int
:として fun add x y = x+y;
fun add(x,y) = x+y;
は、第一の方法は、関数型を作成します val add = fn : int *
空リストのタイプがSML(私はPolyMLを使用しています)に何であるのでしょうか? 私は通訳に[]を入力すると、私が出る: val it = []: 'a list
私が期待するものです。しかし、その後、私が入力した場合は言う: fun f a = if a = 0 then [] else [[]];
が、私は得る: val f = fn: int -> 'a list list
の値の制限では、タイプの安全性を損なう可能性のあるコンテキストでのタイプの一般化が防止されます。コアの問題は、このOCamlのコードで、例えばように、配列決定、突然変異および多型の種類を組み合わせることから生じると思われる: let x = ref [];; (* value restriction prevents generalization here *)
x := 1::!x;; (
は三木の種類が定義されます。私は、関数は三元ツリーに一致するように& foldlのをマップ変更する必要が datatype ’a tree =
Leaf of ’a
| Node of ’a tree * ’a tree * ’a tree
... fun tree_map (f : ’a -> ’b) (t : ’a tree) : ’b tree =
f,nil) = nil
|
次の関数: fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n - 1)
または関数で: fun even 0 = true
| even x = odd(x-1)
and odd 0 = false
| odd x = even(x-1);
私はMLで少し経験を持っていると私はちょう
MLで変数に複数の型を持たせることは可能ですか? たとえば、ツリー内のノードをintまたは文字列にしたい場合。 Node of int * string
これを試しましたが、タプルタイプ(int、string)になります。私はそれがタプル、intまたは文字列のいずれかになりたくない。これは許可されていますか?
のは、私は次のツリーデータ型を持っているとしましょう:ここ datatype 'a tree = Empty | Node of 'a * 'a tree * 'a tree;
val x = Node(10, Node(20, Empty, Empty), Node(30, Empty, Empty));
、xはint型の木の変数です。私が知りたいのは、与えられた木のさまざまな部分を解剖し
私は機能を構築しています:文字列とそのサイズを取得し、それが逆に戻る val recur = fn : string * int -> string;
を。 しかし、多少、私はそれを建てたとして、それは、私のために動作しません。誰が私に問題を指すことができますし、多分少し修正を与える: fun recur (s:string, sz:int) = if sz = 1 then substrin