2017-02-12 55 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

也是一個很好的答案 –