在纯函数 ML 中进行 N 维行走?
这个想法是遍历多个维度,每个维度都定义为一个范围
(* lower_bound, upper_bound, number_of_steps *)
type range = real * real * int
,因此功能类似于 fun foo y x
或 fun foo zy x
可以应用于整个正方形 XY 或立方体 XY*Z。
SML/NJ 不喜欢我下面的实现:
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>))
这是代码:
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
这种构造是否可能?
欢迎任何指针。
The idea is to walk over multiple dimensions, each one defined as a range
(* lower_bound, upper_bound, number_of_steps *)
type range = real * real * int
so functions like fun foo y x
or fun foo z y x
could be applied to the whole square XY or cube XY*Z.
SML/NJ doesn't like my implementation below :
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>))
Here's the code :
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
Is this kind of construct even possible ?
Any pointer welcomed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
walk
可以在机器学习的类型系统中表达吗?ML 中的这两种类型不可能存在相同的值。
不过,我们可以轻松地为每种所需类型生成值。
这样,以下值就存在于所需的类型中。
那么你只需要编写
To use the same
walk
for every Dimensionality,你需要它为每个维度使用相同的类型。因为类型更改为
您的用法也必须更改为
Is
walk
expressible in ML's type system?The same one value cannot possibly exist with both those types in ML.
We can easily generate values for each of the desired types, though.
With this, the following values exist with the desired types.
Then you only need to write
To use the same
walk
for every dimensionality, you need it to use the same type for every dimensionality.Because the type is changed to
your usage also has to change to
找到了这个可变数量参数的实现。 不确定它是否适用,但它看起来很丑陋。
Found this implementation for variable number of arguments. Not sure it applies but it looks quite ugly.