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

If statement Elm-每个if分支执行多行,if-statement,elm,read-eval-print-loop,If Statement,Elm,Read Eval Print Loop,例如,在一个分支中,我想知道一个数字可以被1000整除多少次,然后递归地将起始数字减去该值传递给函数。这是我写的: 如果num//1000>0,则 重复(num//1000)(String.fromChar'M') 转换器OM(数量%1000) 但是,在测试时,我在REPL中遇到以下错误: >getRomNums 3500 --类型不匹配------------------------------------------.\.\RomanNumerics.elm 函数“repeat”需要2个参

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

如果num//1000>0,则
重复(num//1000)(String.fromChar'M')
转换器OM(数量%1000)
但是,在测试时,我在REPL中遇到以下错误:

>getRomNums 3500
--类型不匹配------------------------------------------.\.\RomanNumerics.elm
函数“repeat”需要2个参数,但被赋予4个参数。
34 |重复(num//1000)(String.fromChar'M')
35 |>转换器(数量%1000)
也许你忘了一些括号?还是逗号?
如何为单个if分支编写多行代码

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

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

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

convertorom:Int->String
转换器数=
如果num//1000>0,则
String.repeat(num//1000)(String.fromChar'M')++convertToRom(num%1000)
否则如果。。。
其他的
""

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

谢谢!这是我第一次使用函数式语言,所以我还在学习细节。