if-statement - Elm - 每个 if 分支执行多行

标签 if-statement elm read-eval-print-loop

例如,在一个分支中,我想查看一个数字可以被 1000 整除的次数,然后将减去该数量的起始数字递归地传递给函数。这是我写的:

if num // 1000 > 0 then
    repeat (num // 1000) (String.fromChar 'M')
    convertToRom (num % 1000)

但是,我在测试时在 REPL 中收到以下错误:

> getRomNums 3500
-- TYPE MISMATCH ----------------------------------------- .\.\RomanNumerals.elm

Function `repeat` is expecting 2 arguments, but was given 4.

34|             repeat (num // 1000) (String.fromChar 'M')
35|>            convertToRom (num % 1000)

Maybe you forgot some parentheses? Or a comma?

如何为单个 if 分支编写多行代码?

无关的旁注:格式系统使双斜线成为注释,但在 Elm 中双斜线是整数除法。不知道如何解决这个问题。

最佳答案

在 Elm(以及 Haskell 等其他函数式语言)中,您不会像在命令式语言中那样以迭代步骤编写代码。每个函数都必须返回一个值,每个逻辑分支都必须返回一个值。关于如何在 Elm 中“做多件事”没有单一的答案,但是使用 Elm 的类型系统、元组和递归,您会发现缺少命令式并不会真正阻止您做任何事情。这只是从以命令式风格编写代码的范式转变。

为了您编写罗马数字转换函数的目的,我认为直接的答案在于对结果使用显式递归和字符串连接:

convertToRom : Int -> String
convertToRom num =
    if num // 1000 > 0 then
        String.repeat (num // 1000) (String.fromChar 'M') ++ convertToRom (num % 1000)
    else if ...
    else
        ""

随着函数式编程工具集的增长,您会发现自己显式地使用递归的次数越来越少,而依赖于更高级别的抽象,如折叠和映射。

关于if-statement - Elm - 每个 if 分支执行多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48508563/

相关文章:

mySQL:当值x = ' '然后值y = 6时插入选择

javascript - 使用一个脚本同时打开多个页面

list - 如何为 Grid (2d List) 类型制作 indexedMap 函数?

javascript - 在Elm中,如何通过字符串访问字段?

scala - 从 REPL 评估 Scala 中的字符串命令

python - Pylons REPL 在运行的 Web 服务器中重新评估代码

if-statement - Golang 模板变量 isset

用于双字符串比较的 C case 语句

elm - 如何从 Http.Error 中获取错误消息?

types - 有关类型实例的详细信息