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

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 很陌生,正在努力寻找可以帮助我摆脱命令式思维模式的资源。

And*_*ewC 5

您不需要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 布局中。