gpt4 book ai didi

functional-programming - 如何在 ELM 中重构此功能?

转载 作者:行者123 更新时间:2023-12-04 17:41:30 30 4
gpt4 key购买 nike

我正在尝试学习函数式编程,并决定从 Project Euler 的问题 1 开始:基本上将所有小于 1000 的数字相加,可被 3 或 5 整除(链接:a link)。

这是我写的代码。它输出一个 3 或 5 的因子列表(仍然需要弄清楚如何求和)。

import Html exposing (text)
import Array

main =
text (
toString
[findSum_maxZ 3 5 1000]
)

findSum_maxZ x y max_z =
Array.filter isDivisible_x_or_y (Array.initialize max_z identity)

isDivisible_x_or_y x =
if x % 3 == 0 || x % 5 == 0 then True else False

我的问题是我引用了 3 和 5 两次,但我不能用更抽象的“x”和“y”的附加参数调用 isDivisible。我的目标是确定删除这些人为可变值的有效方法,以便最终用户只需修改每个输入值一次。有什么建议吗?

如果这个问题很愚蠢,我很抱歉,没有很多关于 ELM 的信息可用(特别是与我使用的 python、c、c++、java 等相比),我仍然对函数式编程术语不太满意。任何和所有的帮助表示赞赏。

最佳答案

ML 语言最酷的地方在于,您几乎可以自由地构建自己的“方言”来解决问题。

您可以使用柯里化(Currying)来应用 xy函数的参数,创建一个新函数,其中已经设置了提供的值。

import Html exposing (text)
import Array

main = [findSum 3 5 1000]
|>toString
|>text

findSum x y maxZ =
let
isDivisibleByX = isDivisible x
isDivisibleByY = isDivisible y
in
Array.initialize maxZ identity
|>Array.filter isDivisibleByX
|>Array.filter isDivisibleByY
--as you can see, it is possible to use a list instead of creating
--new functions, it is up to you to check which abstraction works
--the best


isDivisible a b =
b % a == 0

您还可以使用单个函数,而无需使用柯里化(Currying):
import Html exposing (text)
import Array

main = [findSum 3 5 1000]
|>toString
|>text

findSum x y maxZ =
Array.initialize maxZ identity
|>Array.filter (\n-> isDivisible x n ) --or just (isDivisible x)
|>Array.filter (\n-> isDivisible y n)


isDivisible a b =
b % a == 0

如果你想只用一行过滤数组,你可以这样做:
import Html exposing (text)

main = findSum 3 5 1000
|>toString
|>text

findSum x y maxZ =
let
divisibles = \n-> isDivisible x n && isDivisible y n
in
List.range 0 maxZ
|>List.filter divisibles

isDivisible a b =
b % a == 0

关于functional-programming - 如何在 ELM 中重构此功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50750657/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com