榆树 - 每个分支执行多行

时间:2018-01-29 19:25:18

标签: 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中,双斜杠是整数除法。不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:6)

在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
        ""

随着您的功能编程工具集的发展,您会发现自己明确地使用递归越来越少,并依赖于更高级别的抽象,如折叠和地图。