2014-06-27 34 views
2

我是Elixir中的新成員,但我的谷歌搜索和閱讀沒有找到我解決當前問題的方法。我只在書籍和教程中看過一個例子,將單個列表參數傳遞給一個函數,例如:[ head | tail ]Elixir - 傳遞多個列表作爲函數參數

defmodule Math do 
    def double_each([head|tail]) do 
    [head * 2| double_each(tail)] 
    end 

    def double_each([]) do 
    [] 
    end 
end 

我需要在兩個列表中通過,然後對他們執行一些操作,比如:

defmodule Pagination do 
    def getPaginatedList([], _, _, _) do 
    [] 
    end 

    def getPaginatedList([list], [paginated], f, l) when f == 1 do 
    Enum.take(list, l) 
    end 

    def getPaginatedList(_, [paginated], f, l) when l <= f do 
    paginated 
    end 

    def getPaginatedList([list], [paginated] \\ [], f, l) do 
    getPaginatedList(tl(list), paginated ++ hd(list), f, l - 1) 
    end 
end 

不過,我收到一個錯誤有關將在何時不匹配功能的語句列表中的a和列表中的b,如下面的錯誤:

iex(23)> Pagination.getPaginatedList(a, b, 1, 2) 
** (FunctionClauseError) no function clause matching 
     in Pagination.getPaginatedList/4 
    pagination.ex:2: Pagination.getPaginatedList([1, 2, 3, 4, 5], [], 1, 2) 

任何想法,我可能做錯了嗎? (道歉,如果這是一個簡單的問題要回答,我幾個小時的搜索和玩這個後,我還沒有找到任何答案。)

回答

4

你的問題是列表參數模式匹配。對於listpaginated參數,因爲您實際上在嵌套列表中匹配,所以不需要將它們包裝在列表中。另外,在Elixir中使用蛇情況來表示函數名是常規的。試試這個給人打預防針:

defmodule Pagination do 
    def get_paginated_list([], _, _, _) do 
    [] 
    end 

    def get_paginated_list(list, paginated, f, l) when f == 1 do 
    Enum.take(list, l) 
    end 

    def get_paginated_list(_, paginated, f, l) when l <= f do 
    paginated 
    end 

    def get_paginated_list(list, paginated \\ [], f, l) do 
    get_paginated_list(tl(list), paginated ++ hd(list), f, l - 1) 
    end 
end 
0

@克里斯解決您遇到的錯誤消息,我只補充一點,方法簽名是不是很「elixirish」。

以下方法簽名更是在語言的精神和編碼風格(我已經改變了一些參數名稱是更具可讀性):

defmodule Pagination do 
    def get_paginated_list([], _, _, _) do 
    [] 
    end 

    def get_paginated_list(list, _, page_num, page_size) when page_num == 1 do 
    Enum.take(list, page_size) 
    end 

    def get_paginated_list(_, paginated, page_num, page_size) when page_size <= page_num do 
    paginated 
    end 

    def get_paginated_list([head | tail], paginated \\ [], page_num, page_size) do 
    get_paginated_list(tail, paginated ++ [head], page_num, page_size - 1) 
    end 
end 

我不太確定你的代碼的語義應該是什麼,但對於分頁,我想你可能想看看Enum.chunk/4,你可以這樣使用:

defmodule Pagination do 
    def get_paginated_list(list, page_num, page_size) do 
    list |> Enum.chunk(page_size, page_size, []) |> Enum.at(page_num) 
    end 
end 

Pagination.get_paginated_list([1, 2, 3, 4, 5], 1, 3) 
# => [4, 5] 
Pagination.get_paginated_list([1, 2, 3, 4, 5], 0, 3) 
# => [1, 2, 3] 
Pagination.get_paginated_list([1, 2, 3, 4, 5], 2, 3) 
# => nil