小编Tho*_*den的帖子

模式匹配和if-else之间的性能差异

为什么OCaml可以生成用于模式匹配的高效机器代码而不用于if-else测试?

我正在阅读Real World OCaml,我遇到了这一部分,他们将模式匹配的性能与if-else测试的性能进行了比较.事实证明,他们的例子中的模式匹配明显快于if-else测试.尽管代码没有使用if-else测试无法实现的任何特殊模式匹配情况,但它只是比较整数.

他们将模式匹配的编译器优化归因于性能差异的原因.编译器将能够生成机器代码,该机器代码基于有效选择的运行时检查集直接跳转到匹配的案例.

我理解这一点,但我真的不明白为什么编译器不能为if-else测试做同样的事情.毕竟,代码只是将整数与整数进行比较.这是因为OCaml还没有(还)优化if-else测试,还是因为不可能优化if-else测试,就像模式匹配一​​样?

模式匹配代码如下所示:

let plus_one_match x =
    match x with
    | 0 -> 1
    | 1 -> 2
    | 2 -> 3
    | _ -> x + 1
Run Code Online (Sandbox Code Playgroud)

if-else代码如下所示:

let plus_one_if x =
    if      x = 0 then 1
    else if x = 1 then 2
    else if x = 2 then 3
    else x + 1
Run Code Online (Sandbox Code Playgroud)

performance ocaml pattern-matching

7
推荐指数
2
解决办法
914
查看次数

不必要地实施Serializable会受到什么惩罚?

我需要为我的分布式系统类开发Java RMI应用程序.

在讲座期间,教授强调只让类实现Serializable,必须通过网络传递价值.

这意味着让太多的类实现Serializable会有一些缺点或惩罚.不需要通过网络发送的类.

我不知道如果你从未真正通过网络发送序列化/反序列化将永远不会发生任何缺点.

java rmi serializable

7
推荐指数
2
解决办法
384
查看次数

OCaml - 浮点数上的函数不起作用

我正在写一些关于浮点数的简单操作.但是当我使用一些内置的浮点函数时

floor 3.2;;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

This expression has type float but an expression was expected of type
         [ `Deprecated_use__Float__round_down ]
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

我的版本是4.02.1

floating-point ocaml

2
推荐指数
1
解决办法
71
查看次数

OCaml - 找不到graphics.cma

在顶层加载图形模块时,出现"无法找到graphics.cma"的错误.

我正在使用OS X,我很确定我已经正确安装了OCaml,因为我已经使用它大约一个月了.因此,似乎图形模块未包含在OCaml包中.

我该如何解决这个问题,或者我如何自己安装Graphics模块?

graphics ocaml module

2
推荐指数
2
解决办法
3198
查看次数

保留管道流的每个第n个元素

我正在使用Conduit以类似流的方式解析一些数据.在流中的某个点上,我需要每12个元素.有没有方便的方法来做到这一点?

我目前正在等待12个元素只是为了返回第一个元素:

get12th :: Monad m => Conduit Int m Int
get12th = loop
  where
    loop = do
        v1 <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        _ <- await
        case v1 of
            Nothing -> return ()
            Just x -> do
              yield x >> loop
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我想知道这是否是最好的方法.

haskell conduit

2
推荐指数
1
解决办法
109
查看次数

Vim 状态行不工作

我在 OS X 上,我已经通过 Homebrew 安装了 Vim

brew install vim
Run Code Online (Sandbox Code Playgroud)

我注意到每当我使用 Vim 时,底部都没有出现状态行。我想我可以通过向 vimrc 添加以下内容来始终显示状态行来修复它:

:set laststatus=2
Run Code Online (Sandbox Code Playgroud)

这向我显示了状态行,但它只是标尺上方的空行。它看起来像这样: 在此处输入图片说明

我错过了什么吗?

编辑

我想在 Haskell 中使用 Vim。我已经安装了haskell-vim-proto。我正在使用包含的vimrc,它应该会导致在状态行中显示诸如语法错误之类的内容。当我编辑 Haskell 文件(使用vimrc)时,我的 Vim 中没有状态栏。添加set laststatus=2到 vimrc 会导致显示空白状态行。

当我学习通过 HomeBrew 安装 Vim 的教程时(就像我一样),使用 Vim 打开任何时间的文件都会在底部显示包含以下内容的状态行:

我实际上是在遵循教程。当他用 Vim 打开 .bash_profile 时,它​​看起来是这样的: 在此处输入图片说明 当我做完全相同的事情时,它看起来像这样: 在此处输入图片说明

macos vim statusline

0
推荐指数
2
解决办法
4198
查看次数