Elm - 每个分支执行多行
Elm - Executing multiple lines per if branch
例如,在一个分支中,我想查看一个数字被 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 等其他函数式语言)中,您不会像在命令式语言中那样以迭代步骤编写代码。每个函数都必须 return 一个值,每个逻辑分支都必须 return 一个值。关于如何在 Elm 中 "do multiple things" 没有单一的答案,但是使用 Elm 的类型系统、元组和递归,您会发现缺少命令式并不会真正阻碍您做任何事情。这只是以命令式风格编写代码的范式转变。
出于编写罗马数字转换函数的目的,我认为直接的答案在于对结果使用显式递归和字符串连接:
convertToRom : Int -> String
convertToRom num =
if num // 1000 > 0 then
String.repeat (num // 1000) (String.fromChar 'M') ++ convertToRom (num % 1000)
else if ...
else
""
随着函数式编程工具集的增长,您会发现自己越来越少地明确使用递归并依赖更高级别的抽象,如折叠和映射。
例如,在一个分支中,我想查看一个数字被 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 等其他函数式语言)中,您不会像在命令式语言中那样以迭代步骤编写代码。每个函数都必须 return 一个值,每个逻辑分支都必须 return 一个值。关于如何在 Elm 中 "do multiple things" 没有单一的答案,但是使用 Elm 的类型系统、元组和递归,您会发现缺少命令式并不会真正阻碍您做任何事情。这只是以命令式风格编写代码的范式转变。
出于编写罗马数字转换函数的目的,我认为直接的答案在于对结果使用显式递归和字符串连接:
convertToRom : Int -> String
convertToRom num =
if num // 1000 > 0 then
String.repeat (num // 1000) (String.fromChar 'M') ++ convertToRom (num % 1000)
else if ...
else
""
随着函数式编程工具集的增长,您会发现自己越来越少地明确使用递归并依赖更高级别的抽象,如折叠和映射。