Skip to content

Instantly share code, notes, and snippets.

@ryoppy
Last active January 1, 2016 09:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryoppy/8122851 to your computer and use it in GitHub Desktop.
Save ryoppy/8122851 to your computer and use it in GitHub Desktop.
練習

判定

1 == 1
> true

1 == 1.0
> true

1 =:= 1.0
> false

(1 == 1) and (2 == 2)
> true

(1 == 1) or (2 == 2)
> true

レコード

構造体のようなもの

Fuga = #product{id=1, name="fuga"}, % レコード作成

#product{id=FugaId, name=FugaName} = Fuga, % レコードから値を取得

Fuga2 = Fuga#product{id=2}, % 値を変える

リストHeadとTail

% 取得
[H|T] = [1,2,3].
> H=1 T=[2,3]

% 先頭に追加
[4|T]
> [4,2,3]

% 結合
T ++ T.
> [2,3,2,3]

リスト内包

[X + X || X <- [1,2,3,4,5], X > 1]
> [4,6,8,10]

[
  {A,B,C} ||
  A <- [1,2],
  B <- [1,3],
  C <- [2,4],
  A < B, A < C
]
> [{1,3,2},{1,3,4},{2,3,4}]

リストの関数

% いつもの
lists:map(fun(N) -> N * N end, [1,2,3]),
> [1,4,9]

lists:flatmap(fun(N) -> if N > 2 -> []; true -> [N * N] end end, [1,2,3]),
> [1,4]

lists:foldl(fun(N, Sum) -> N + Sum end, 0, [1,2,3]),
> 6

lists:zip([1,2,3], [a,b,c]),
> [{1,a},{2,b},{3,c}]

% AがBのsuffixならtrue
lists:suffix([1], [3,2,1]),
> true
lists:suffix([1], [3,2,2]), 
> false

% mapとfoldを同時に行う
lists:mapfoldl(fun(X, Sum) -> {2 * X, X + Sum} end, 0, [1,2,3,4,5]), 
> {[2,4,6,8,10],15}

フィボナッチ

% fib(100)
% result : [55,34,21,13,8,5,3,2,1,1,0]
fib(N) ->
  fib(N, 0, 1, []).
fib(N, A, B, L) ->
  if
    B < N -> fib(N, B, A + B, [A|L]);
    true  -> L
  end.

sum

% sum([1,2,3])
% result : 6
sum(L) ->
  sum(L, 0).
sum([H|T], R) ->
  sum(T, H + R);
sum([], R) ->
  R.

リバース

% reverse([1,2,3])
% result : [3,2,1]
reverse(L) ->
  reverse(L, []).
reverse([H|T], R) ->
  reverse(T, [H|R]);
reverse([], R) ->
  R.

クイックソート

% qsort([5,3,1,4,2,-1,-1,100])
% result : [-1,-1,1,2,3,4,5,100]
qsort(L) ->
  case L of
    []     -> [];
    [H|[]] -> [H];
    [H|T]  ->
      {Left, Eq, Right} = qsort(H, [H|T], [], [], []),
      qsort(Left) ++ Eq ++ qsort(Right)
  end.
qsort(N, [H|T], Left, Eq, Right) ->
  if
    H < N  -> qsort(N, T, [H|Left], Eq, Right);
    H == N -> qsort(N, T, Left, [N|Eq], Right);
    H > N  -> qsort(N, T, Left, Eq, [H|Right])
  end;
qsort(_, [], Left, Eq, Right) ->
  {Left, Eq, Right}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment