- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我已经手动定义了一些类似的代码:
type test = A of bool | B | C of bool * bool
type test2 = D | E of bool * bool
type test3 = F | G of bool | H of bool
let f = function | A(x) -> E(x,true) | B -> D | C(a,b) -> E(b,a)
let g = function | D -> F | E(a,b) -> if a then G(b) else H(b)
test2
的函数。我一直在考虑结构统一,但是我在问以下问题:
let h x = g (f x)
时OCaml会自动执行这种统一吗?
compile
转换为期望的h的ml文件?
最佳答案
免责声明
我不是OCaml编译器开发人员。如果您想征求他们的意见,最好在邮件列表上与他们联系。
第1部分
从理论上讲,现代OCaml(我已经尝试过使用4.0 {3,4} + flambda)能够消除某些类型为test2
的中间数据结构。但是,要实现这一点,您需要传递特殊的优化选项,并将[@@inlined always]
添加到函数f
中,否则即使使用疯狂的内联选项(例如-inline 10000
和-inline-toplevel 10000
)也不会内联。
但是,在一般情况下,对于较大的功能,这可能不起作用。在这里,我假设您所展示的示例是一个玩具示例,在现实生活中,您将面临更大的功能和两个以上的构成(即,数百个构造函数和数百个构成)根本不值得优化)。
第2部分
理论
说到一般算法,如果我们太挑剔,那是不可能的,因为在模式匹配中->
的右边可以有任何OCaml表达式,即图灵完备的程序。因此,我们有一个决策问题的等价物。即使我们通过禁止循环和副作用来限制表达语言,问题仍然是NP难题,因此尝试解决它可能不值得。但是,如果我们通过禁止除带有琐碎操作数的构造函数应用程序之外的任何表达式来进一步限制自己,那么我们实际上将对有限状态机(FSM)进行编码。有很多定义明确的FSM优化和状态最小化算法,因此不难消除冗余。
实践
实际上,我可能不会编写将ml
代码转换为ml
代码的函数。根据我的实际任务,我将考虑以下方法。
可数的输入集
如果居住在类型为test
的值的集合实际上是有限的(即,如果它适合OCaml数组),那么我将尝试编写一个枚举类型为test
的所有可能值并存储结果的函数组成。您可以使用[@@deriving enumerate]
计算类型为test
的所有可能值
# type test = A of bool | B | C of bool * bool [@@deriving enumerate];;
type test = A of bool | B | C of bool * bool
val all_of_test : test list =
[A false; A true; B; C (false, false); C (true, false); C (false, true);
C (true, true)]
test
类型的值分配一个序数,并进行O(1)转换以键入
test3
。另外,因为我们已经预先计算了所有构造函数,所以根本没有分配。
test -> int
才能使用我们的工作方式,并且此操作将需要
log(k)
个分支,其中
k
是类型为
test
的构造函数的数量。从big-O表示法的角度来看,
k
是恒定的。但是如果确实很大,则可以尝试使所有构造函数成为无参数的,例如通过将
A of bool
表示为两个构造函数
A_true
和
A_false
。在这种情况下,您将获得纯O(1)转换,而没有任何开销(只是数组取消引用)。
int
或
string
类型的值的构造函数,则实际上不可能枚举它们。但是,如果转换
h
不查看此值,而只是重新排列它们,即将它们视为
Uninterpreted functions,则应尝试使用GADT将此参数与输入语言分离。假设您具有以下数据构造函数:
| C of string
h (C s)
对于所有
s
都是相同的。这样就完全不需要将
s
传递给
h
了。但是,您仍然希望将有效负载
s
传递给其他函数,例如,传递给
exec
。可以使用GADT,首先我们将有效负载与构造函数解耦:
| C : string query
val exec : 'a query -> 'a -> unit
关于pattern-matching - 通过功能组合来统一OCaml模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422080/
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
它具有看似简单的代码: method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil } 但是,这是它的行为: (^3).matc
如果您想检查某项是否与正则表达式匹配,如果是,请打印第一组,您就可以了.. import re match = re.match("(\d+)g", "123g") if match is not N
以下两个查询的结果有差异吗? SELECT * FROM table1, table2 WHERE ( MATCH(table1.row1) AGAINST('searchstring' IN
我正在尝试为我的日志文件创建一个语法文件。它们采用以下格式: [time] LEVEL filepath:line - message 我的语法文件如下所示: :syn region logTime
String#match 和 Regexp#match 在匹配成功时返回一个 MatchData: "".match(//) # => # //.match("") # => # //.match(:
我的代码中有这个函数: func match(match: GKMatch, player playerID: String, didChangeState state: GKPlayerConnec
我对 match 和 case 之间的区别感到困惑。在 document ,其中提到match支持通用模式匹配。 > (define (m x) (match x [(list a
我在检查特定元素中的空 HTML 内容时遇到了问题。当我使用 someElement.trim().match("") 即使 HTML 内容为空,我有时也会得到 true。我改成了 someEleme
我正在尝试使用正则表达式查找包含特定词的两个词之间的所有内容,但是这些词是重复的,所以我没有得到我想要的匹配项。 例如,我想要“你好”和“再见”之间的所有内容,以便它们之间存在“苹果”一词: hell
我目前正在构建一个 PHP 脚本,它将在需要时响应 HTTP“304 Not Modified”。 (请参阅 question #2086712 了解我目前所做的事情)。 目前我回答以下问题: If-
给定以下 XML 10 我希望能够正确识别内部 的 s : result = subject.gsub(/]*>)/, '<') 解释: ]* # any number of charact
这个问题在这里已经有了答案: How to error handle 1004 Error with WorksheetFunction.VLookup? (3 个回答) 3年前关闭。 目标:查找输入
我已经尝试了好一阵子了,但是我似乎无法弄清楚这两者之间的区别。特别是,与数据数组有关的差异: PS C:>$myarray = "a", "ab", "abc" PS C:>$myarray -mat
我正在努力研究如何构建一个宏,让我可以将模式和结果以向量的形式传递给 core.match/match 。我希望能够做到这一点: (let [x {:a 1} patterns [[{:a
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 8 年前。 如果这看起来微不足道但只是为了理解正则表达式,请原谅我:
我的 MySQL 表中有大约 20 行,其 Title 列为 Elsewhere 并具有其他不同的列参数。 我目前正在使用这样的查询,因为我的大多数搜索(通过 PHP 文件)都需要我进行猜测。所以我使
当找到匹配时,我必须从字符串中删除单词 让我们看看 我的输入字符串是 “肯诺克斯路” 比赛表演中的单词表 街道 驾驶 道路 4. 车道 输出字符串应该是: KENOX 我正在使用 vb.net 作为此
我正在搜索以下形式的字符串模式: XXXAXXX # exactly 3 Xs, followed by a non-X, followed by 3Xs 所有的 X 必须是相同的字符,并且 A 不能
好吧,我是 gulp 和 sass 的新手,我正在努力让它发挥作用。我正确安装了所有东西,但我收到了这个愚蠢的错误。有解决办法吗? PS C:\Users\Bojan Kolano\Desktop\F
我是一名优秀的程序员,十分优秀!