Jac*_*man 4 if-statement read-eval-print-loop elm
例如,在一个分支中,我想看看一个数字可以被1000整除多少次,然后将起始数量少于该数量递归到函数中.这就是我写的:
if num // 1000 > 0 then
repeat (num // 1000) (String.fromChar 'M')
convertToRom (num % 1000)
Run Code Online (Sandbox Code Playgroud)
但是,我在测试时在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?
Run Code Online (Sandbox Code Playgroud)
如何为单个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
""
Run Code Online (Sandbox Code Playgroud)
随着您的功能编程工具集的增长,您会发现自己明确地使用递归越来越少,并依赖于更高级别的抽象,如折叠和贴图.