「命令的思考」を手放し、代わりに「機能的思考」に心を向ける必要があります。例えば
前述のように、変数が参照でない限り、変数を再割り当てすることはできません。また、参照を使用する必要がある場合は、とにかく「間違った」ことをしている可能性があります。関数型プログラミングでは、変数の代入ではなく、実際に名前バインディング(単一の代入とも呼ばれます) を行っています。それらを「不変オブジェクト」と考えてください。
最初にコードを見てみましょう
let
val actualDays = 0;
in
actualDays = List.nth([10,20,31,50,45], 2);
actualDays
end;
パーツ内に一連の式を配置する場合、in ... end
実際には を使用するのと同じin ( expr_1; ... ; expr_n) end
です。一連の式を表す括弧に注意してください。一連の式は、各式を左から右に評価し、最後の式の結果以外はすべて無視します。したがって、主に副作用のある式を評価するために使用されます
- (print "foo\n"; print "bar\n"; 3);
foo
bar
val it = 3 : int
あなたの場合、等号は代入演算子ではなく比較演算子であるため、最初の式はブール式に評価され、副作用がないため「無視」され、値がactualDays
そのまま返されます最後の表現です。
actualDays
例を修正する 1 つの方法は、 が の結果であると宣言することですList.nth
。次に、関数は 2 つの引数を取ることができます。1 つの引数は取得する要素であり、もう 1 つの引数は検索したくないインデックスです。
fun foo x i =
let
val actualDays = List.nth([10,20,31,50,45], i)
in
x = actualDays
end
- foo 20 1;
val it = true : bool
- foo 50 3;
val it = true : bool
ただし、この特定の関数では、let 式は必要なく、次のように記述してもかまいません。
fun foo x i = x = List.nth([10,20,31,50,45], i)