如何使用Elm中的循环构建列表?

时间:2017-02-12 17:46:12

标签: loops elm

假设我有两个列表,列出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函数?

3 个答案:

答案 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