Dee*_*531 2 functional-programming elm
type alias Bag a = List (a, Int)
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建与此类型别名一起使用的函数,但我不知道如何从函数返回 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
Run Code Online (Sandbox Code Playgroud)
如何在不使用下面的多行方法的情况下初始化一个新的 Bag?
testBag : Bag Int
testBag = [(5,1),(2,1)]
Run Code Online (Sandbox Code Playgroud)
PS 对 Elm 很陌生,正在努力寻找可以帮助我摆脱命令式思维模式的资源。
您不需要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
Run Code Online (Sandbox Code Playgroud)
这可行,但我不会那样写。我使用模式匹配将 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
Run Code Online (Sandbox Code Playgroud)
我还要定义
emptyBag : Bag a
emptyBag = []
Run Code Online (Sandbox Code Playgroud)
这样你就可以
exampleBag : Bag Int
exampleBag = emptyBag |> add 5 |> add 3 |> add 5 |> add 3 |> add 3
Run Code Online (Sandbox Code Playgroud)
顺便说一句,当您保存工作时,大多数 IDE 都可以自动运行elm-format 。这将使您的代码更易于维护且更易于阅读。其他 elm 程序员会发现更容易阅读您的代码,因为它位于常用的 elm 布局中。