gpt4 book ai didi

functional-programming - 如何在 Elm 中初始化这样的类型别名?

转载 作者:行者123 更新时间:2023-12-02 01:39:51 24 4
gpt4 key购买 nike

 type alias Bag a = List (a, Int)

我正在尝试创建与此类型别名一起使用的函数,但我不知道如何从函数返回 Bag 。就像在下面的函数中一样,我希望将一个新项目插入到现有的 bag 中(可能是空的,这是我目前正在尝试开始工作的唯一情况)。

insert : a -> Bag a -> Bag a
insert b c = case c of
[] -> Bag a : [(b, 1)]

--this case below is what I'm hoping could work out..cant really check without getting the first case to work---
x::xs -> if Tuple.first x == b
then Bag a : [(b, (Tuple.second x) + 1)] ++ xs
else [x] ++ insert b xs

如何在不使用下面的多行方法的情况下初始化一个新 Bag?

testBag : Bag Int
testBag = [(5,1),(2,1)]

PS 对 Elm 很陌生,正在努力寻找可以帮助我摆脱命令式思维模式的资源。

最佳答案

您不需要在bags前面写Bag a:。编译器可以推断出您需要什么类型。

您确实需要匹配案例的不同分支的缩进:

insert : a -> Bag a -> Bag a
insert b c = case c of
[] -> [(b, 1)]
x::xs -> if Tuple.first x == b
then [(b, (Tuple.second x) + 1)] ++ xs
else [x] ++ insert b xs

这可行,但我不会那样写。我使用模式匹配将 b 拆分为项目并计数,而不是 Tuple.first 和 Tuple.second,并且我会为变量使用更具描述性的名称,给出:

add : a -> Bag a -> Bag a
add item bag =
case bag of
[] -> [ ( item, 1 ) ]
( firstItem, count ) :: otherItems ->
if item == firstItem then
( firstItem, count + 1 ) :: otherItems
else
( firstItem, count ) :: add item otherItems

我也会定义

emptyBag : Bag a
emptyBag = []

这样你就可以制作

exampleBag : Bag Int
exampleBag = emptyBag |> add 5 |> add 3 |> add 5 |> add 3 |> add 3

顺便说一句,大多数 IDE 都可以运行 elm-format当您保存工作时会自动为您提供。这将使您的代码更易于维护且更易于阅读。其他 elm 程序员会发现更容易阅读您的代码,因为它位于常用的 elm 布局中。

关于functional-programming - 如何在 Elm 中初始化这样的类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71777046/

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