[Elixir]Enumerable이라는 Protocol
9418 단어 Elixir
Enumerable
라는 모듈 같은 것이 나왔기 때문에 무엇인가 조사해 보았다.쫓아 갔을 때 갑자기 나왔다
Enumerabe.slice
2163 def random(enumerable) do
2164 result =
2165 case Enumerable.slice(enumerable) do
수수께끼
Elixir에는 Enum 모듈이 존재하는 이유는 무엇입니까?
처음에는 이것을 몰랐다.
IEx에서이 코드를 시도한 결과
iex(2)> Enumerable.slice([1,2,3])
{:error, Enumerable.List}
iex(3)> Enumerable.slice(%{a: 10, b: 20})
{:ok, 2, #Function<0.84261211/2 in Enumerable.Map.slice/1>}
뭐야 너? ?
결론
결론은 Protocol이었다.
Protocol이라고 하는 것은 ElixirSchool씨에 의하면 이하와 같은 것입니다.
프로토콜은 Elixir에서 폴리모르피즘을 획득하는 수단입니다.
그건 그렇고, Enumerable은 다음과 같은 함수를 가지고 있다고 생각합니다.
count(enumerable)
member?(enumerable, element)
reduce(enumerable, acc, fun)
slice(enumerable)
Function에 구현된 Enumerable.reduce의 이야기
이 enum.ex을 보면 대부분 아래쪽에
defimpl
항목이 나오는데 거기에 Function
에 대해 구현한 부분이 있군요
3992 defimpl Enumerable, for: Function do
3993 def count(_function), do: {:error, __MODULE__}
3994 def member?(_function, _value), do: {:error, __MODULE__}
3995 def slice(_function), do: {:error, __MODULE__}
3996
3997 def reduce(function, acc, fun) when is_function(function, 2), do: function.(acc, fun)
3998
3999 def reduce(function, _acc, _fun) do
4000 raise Protocol.UndefinedError,
4001 protocol: @protocol,
4002 value: function,
4003 description: "only anonymous functions of arity 2 are enumerable"
4004 end
4005 end
이게 뭐야
확실히
count
, member?
, slice
, reduce
함수를 만족하지만 실제로 구현되는 것은 reduce
함수 만.. 덧붙여서 사용해 보면 이런 느낌
iex(8)> Enumerable.reduce(fn acc, f -> Enum.map(1..10, & f.(&1, acc)) end, [], fn n, acc -> acc ++ [n] end)
[[1], [2], [3], [4], [5], [6], '\a', '\b', '\t', '\n']
내 상상력으로는 어쩐지 2차원 배열을 좋게 reduce 할 수 있는 것은 라고 생각하거나 합니다만 자세한 것은 잘 모르겠습니다...
자세한 사용법을 알고 계시다면 알려주세요
Reference
이 문제에 관하여([Elixir]Enumerable이라는 Protocol), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gr8distance/items/dccd948d027ce6b7ef5b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)