アイデアはそうfun foo y x
又はfun foo z y x
ような機能は全体正方形X Y又はキューブX Yに適用することができる範囲として定義各純粋な機能的なMLでN次元の散歩をしていますか?
(* lower_bound, upper_bound, number_of_steps *)
type range = real * real * int
、複数の次元にわたって歩くことです* Z.
test2.sml:7.5-22.6 Error: right-hand-side of clause doesn't agree with function result type [circularity]
expression: (real -> 'Z) -> unit
result type: 'Z -> 'Y
in declaration:
walk = (fn arg => (fn <pat> => <exp>))
ここでコードがあります:
SML/NJは、以下の私の実装が好きではありません
fun walk [] _ =()
| walk (r::rs) f =
let
val (k0, k1, n) = r
val delta = k1 - k0
val step = delta/real n
fun loop 0 _ =()
| loop i k =
let in
walk rs (f k) ; (* Note (f k) "eats" the first argument.
I guess SML doesn't like having the
type of walk change in the middle of its
definition *)
loop (i - 1) (k + step)
end
in
loop n k0
end
fun do2D y x = (* ... *)()
fun do3D z y x = (* ... *)()
val x_axis = (0.0, 1.0, 10)
val y_axis = (0.0, 1.0, 10)
val z_axis = (0.0, 1.0, 10)
val _ = walk [y_axis, x_axis] do2D
val _ = walk [z_axis, y_axis, x_axis] do3D
さえ可能コンストラクトのこの種のですか?
任意のポインタを歓迎します。
ところで、私はあなたの「純粋な機能」の使用に同意しません。これはSMLのような命令的言語でのみ有効です。 'ユニット。ユニットの配列決定は副作用なしに無意味である。 – ephemient
それは私が期待したものですが、それはまったく純粋ではありません。まあ、少なくとも純粋に純粋な他の関数型言語とは異なり、SMLは保証された評価順序を持っています。 – ephemient
真ですが、関数do2Dとdo3Dは単純なprint文ですので、テストのためにできるだけ多くのコードを削除しました – diapir