是否有任何内省的魔法会给我一个模块中定义的函数列表?
module Foo
function foo()
"foo"
end
function bar()
"bar"
end
end
Run Code Online (Sandbox Code Playgroud)
一些神话般的功能如:
functions_in(Foo)
Run Code Online (Sandbox Code Playgroud)
哪个会回归:[foo,bar]
我已经做了一些搜索,显然在标准库中曾经有一个Bignum模块根据这个 但是在这一点上我没有在标准库中看到任何东西.
给定以下类型定义:
type 'a range = Full | Range of ('a * 'a);;
Run Code Online (Sandbox Code Playgroud)
如何将此类型的值转换为字符串?
我目前有:
let string_of_range r = match r with
| Full -> "Full"
| Range(a,b) -> "Range("^(string_of_int a)^","^(string_of_int b)^")";;
Run Code Online (Sandbox Code Playgroud)
但是,当然,这表示a和b的类型为int.它们也可以是浮点数或字符(请参阅我之前关于约束类型的问题)
我认为新手会被"做"弄糊涂,我从语言设计的角度对此表示怀疑.你不想在一个新语言的生命的这个阶段混淆新手,几乎每个人都是新手,你想要新手,以建立社区和临界质量;-)
'do'的文档(3.8.3.做或不做)说:
这种结构有一个很好的理由:在Opa中,每个函数定义(更常见的是每个不在顶层的值)以一个值结束,这是函数的结果 - 相反,一旦我们达到第一个值,我们有功能的结果,所以功能完成.
这是我在上面加粗的部分,我想知道:为什么在达到第一个值后功能完成了?为了避免在OCaml中看到这样的事情,我们是否"引入"?:
let _ = (some expression)
Run Code Online (Sandbox Code Playgroud)
在Opa的语言设计中使用'do'的替代方法是什么?如何处理这个问题(从语言设计的角度来看).
在我试图转换为OCaml的F#代码中,我遇到了以下问题:
let rec parseList lst off =
seq {
if List.isEmpty lst then ()
else
match parse off <| List.head lst with
| (Unmatched, _) as y -> yield y
| (y, z) -> yield (y, z)
yield! parseList (List.tail lst) z
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何将 带有yield的seq {...}表达式转换为OCaml?我的第一个猜测是seq必须成为一个列表.
我有一个代表要调用的函数名称的符号:
julia> func_sym = :tanh
Run Code Online (Sandbox Code Playgroud)
我可以使用该符号来获取tanh函数并使用以下方法调用它:
julia> eval(func_sym)(2)
0.9640275800758169
Run Code Online (Sandbox Code Playgroud)
但我宁愿避免那里的'eval',因为它会被多次调用并且它很昂贵(并且func_sym可以根据上下文有几个不同的值).
Ruby中的IIRC你可以说:
obj.send(func_sym, args)
Run Code Online (Sandbox Code Playgroud)
朱莉娅有类似的东西吗?
编辑:有关为什么我有符号表示的函数的更多细节:
我有一个类型(来自神经网络),包括激活功能,最初我把它作为一个函数包括在内:
type NeuralLayer
weights::Matrix{Float32}
biases::Vector{Float32}
a_func::Function
end
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用JLD将这些内容序列化为文件,但是无法序列化函数,所以我使用了符号:
type NeuralLayer
weights::Matrix{Float32}
biases::Vector{Float32}
a_func::Symbol
end
Run Code Online (Sandbox Code Playgroud)
目前我使用上面的eval方法来调用激活函数.有NeuralLayers的集合,每个都可以拥有自己的激活功能.
我使用此类型定义运行了一些OCaml代码:
type thread = < run : thread list ; block : bool >
Run Code Online (Sandbox Code Playgroud)
这个定义中'<'和'>'的含义是什么?它几乎看起来像一个记录声明 - 它只是一个记录声明的替代语法?
使用Images包,我可以打开彩色图像,将其转换为灰度,然后:
using Images
img_gld = imread("...path to some color jpg...")
img_gld_gs = convert(Image{Gray},img_gld)
#change from floats to Array of values between 0 and 255:
img_gld_gs = reinterpret(Uint8,data(img_gld_gs))
Run Code Online (Sandbox Code Playgroud)
现在我有一个1920X1080阵列的Uint8:
julia> img_gld_gs
1920x1080 Array{Uint8,2}
Run Code Online (Sandbox Code Playgroud)
现在我想获得Uint8值的2D数组的直方图:
julia> hist(img_gld_gs)
(0.0:50.0:300.0,
6x1080 Array{Int64,2}:
1302 1288 1293 1302 1297 1300 1257 1234 … 12 13 13 12 13 15 14
618 632 627 618 623 620 663 686 189 187 187 188 185 183 183
0 0 0 0 0 0 0 0 9 9 8 …Run Code Online (Sandbox Code Playgroud)