如何在 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 榆树布局中。
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 榆树布局中。