2017-02-12 25 views
3

假设我有两个列表,列表letters,包含字母A-F,列表nums,包含数字1-6。如何在Elm中使用循环构建列表?

在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));

你怎么会写在榆树等效combineLists功能?

回答

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 
+0

我很欣赏的方式如何实现' combineLists' functio –

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似乎没有相同的公关在榆树的地方IDE因为它在Haskell,但我有它的完整性,是我会写我的代码

2

下面是使用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 
+0

也是一个很好的答案 –