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

How do I initialize a type alias like this in Elm?

 type alias Bag a = List (a, Int)

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

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

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

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

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

这行得通,但我不会那样写。我会使用模式匹配将 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。这将使您的代码更易于维护和更易于阅读。其他榆树程序员会发现更容易阅读您的代码,因为它会在 frequently-used 榆树布局中。