假设我有两个列表,列出letters
,包含字母A-F,列表nums
,包含数字1-6。
在Elm中,我如何以编程方式制作包含所有可能组合的列表(即A1,C6,F3,D2等)?
这仅仅是为了代码优雅,硬编码每个可能的组合都是等价的。
在JavaScript中,它将由......等表示。
const nums = [1,2,3,4,5,6];
const letters = [`a`,`b`,`c`,`d`,`e`,`f`];
const combineLists = (a,b)=>{
const newList = [];
a.forEach(aEl=>{
b.forEach(bEl=>{
newList.push(aEl + bEl);
})
})
return newList;
}
console.log(combineLists(letters,nums));
你如何在Elm中编写等效的combineLists
函数?
答案 0 :(得分:9)
这是我的建议,我认为这是最简洁的
module Main exposing (..)
import Html exposing (..)
nums : List Int
nums =
[ 1, 2, 3, 4, 5, 6 ]
letters : List String
letters =
[ "a", "b", "c", "d", "e", "f" ]
main =
nums
|> List.map toString
|> List.concatMap (\n -> List.map (String.append n) letters)
-- or in point free style
-- |> List.concatMap (String.append >> flip List.map letters)
|> toString
|> text
Point free style似乎没有像在Haskell中那样在Elm中具有相同的自豪感,但我将其包含在内以保证完整性并且是我编写代码的方式
答案 1 :(得分:3)
我不确定这是最好的实现,但你可以试试这个:
import Html exposing (..)
nums : List Int
nums =
[ 1, 2, 3, 4, 5, 6 ]
letters: List String
letters =
[ "a", "b", "c", "d", "e", "f" ]
combineLists : List a -> List b -> List String
combineLists list1 list2 =
List.concatMap
(\elList1 ->
List.map
(\elList2 -> toString elList1 ++ toString elList2)
list2
)
list1
main =
text <| toString <| combineLists letters nums
这可能是另一种方法:
import Html exposing (..)
nums : List Int
nums =
[ 1, 2, 3, 4, 5, 6 ]
letters: List String
letters =
[ "a", "b" , "c" , "d", "e", "f" ]
combineLists : List a -> List b -> List String
combineLists list1 list2 =
List.map toString list1
|> List.concatMap
(\e1 ->
List.map (toString >> String.append e1) list2
)
main =
text <| toString <| combineLists letters nums
答案 2 :(得分:3)
这是使用andThen
List.Extra
的另一种可能性
import Html exposing (text)
import List.Extra exposing (andThen)
nums : List Int
nums =
[ 1, 2, 3, 4, 5, 6 ]
letters : List String
letters =
[ "a", "b", "c", "d", "e", "f" ]
main =
andThen
(\num -> andThen
(\letter -> [(toString num) ++ letter])
letters )
nums
|> toString
|> text