第四章 练习题
(2) 内置函数 tuple_to_list(T) 能将元组 T 里的元素转换成一个列表。请编写一个名为
my_tuple_to_list(T) 的函数来做同样的事,但不要使用相同功能的内置函数。
- my_tuple_to_list(T) ->
- %% 最优雅的处理方式
- [element(N, T) || N <- lists:seq(1, tuple_size(T))].
应当在 X 是偶整数时返回 true ,否则返回 false 。 odd(X) 应当在 X 是奇整数时返回 true 。
(6) 向 math_functions.erl 添加一个名为 filter(F, L) 的高阶函数,它返回 L 里所有符合
条件的元素 X (条件是 F(X) 为 true )。
(7) 向 math_functions.erl 添加一个返回 {Even, Odd} 的 split(L) 函数,其中 Even 是一个
包含 L 里所有偶数的列表, Odd 是一个包含 L 里所有奇数的列表。请用两种不同的方式编写这个函数,一种使用归集器,另一种使用在练习6中编写的 filter 函数。
第五章
(2) 编写一个 map_search_pred(Map, Pred) 函数,让它返回映射组里第一个符合条件的
{Key,Value} 元素(条件是 Pred(Key, Value) 为 true )。
以上练习题都做在在一个文件中, 我也懒得挨个贴了, 贴一个文件都包括了,自己慢慢看吧
math_funcitons.erl
- -module(math_functions).
- -author("lunay").
- %% API
- -export([
- even/1,
- odd/1,
- filter/2,
- split/1,
- split2/1,
- map_search_pred/2
- ]).
- even(H) ->
- case H rem 2 of
- 0 -> true;
- 1 -> false
- end.
- odd(H) ->
- case H rem 2 of
- 1 -> true;
- 0 -> false
- end.
- filter(F, L) ->
- [X || X <- L, F(X) =:= true].
- split(L) ->
- %%使用高阶函数实现
- Odds = filter(fun(X)-> X rem 2 =:= 1 end , L),
- Evens = filter(fun(X)-> X rem 2 =:= 0 end, L),
- {Evens, Odds}.
- split2(L) ->
- split(L, [], []).
- split([H|T], Even, Odd) ->
- case H rem 2 of
- 0 -> split(T, [H|Even], Odd);
- 1 -> split(T, Even, [H|Odd])
- end;
- split([], Even, Odd) ->
- {Even, Odd}.
- %%编写一个 map_search_pred(Map, Pred) 函数,让它返回映射组里第一个符合条件的
- %%{Key,Value} 元素(条件是 Pred(Key, Value) 为 true )。
- map_search_pred(Map, F) ->
- L = maps:to_list(Map),
- map_search_pred_do(L, F, {}).
- map_search_pred_do([H|T], F, Res) ->
- case tuple_size(Res) of
- 0 -> {X, Y} = H,
- case F(X, Y) of
- true -> map_search_pred_do([], F, {X,Y});
- false -> map_search_pred_do(T, F, Res)
- end;
- _ -> H
- end;
- map_search_pred_do([], _, Res) ->
- Res.