首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >“函数”可以在Elixir中实现协议吗?

“函数”可以在Elixir中实现协议吗?
EN

Stack Overflow用户
提问于 2016-03-06 04:14:32
回答 4查看 247关注 0票数 1

有没有办法让函数"type“在Elixir中实现一个协议?我正在尝试一个自定义的Functor协议,我想知道是否可以让函数实现它(忽略Elixir的类型系统的所有限制)。

实现(如果是function,其中是类型)将是

代码语言:javascript
代码运行次数:0
运行
复制
defimpl Category.Functor, for: function do
  def fmap(f, g), do: &(g.(f.(x))
end

假设你可以这样做

代码语言:javascript
代码运行次数:0
运行
复制
f_2x_plus_1 = &(&1 * 2) |> Functor.fmap(&(&1 + 1))
f_2x_plus_1.(1) == 3

并不是说我会把它用在任何严肃的事情上,只是好奇而已。

EN

回答 4

Stack Overflow用户

发布于 2016-03-08 03:24:13

事实证明你能做到。下面是我正在进行的实现,它可能会产生一个名为excategory的库

代码语言:javascript
代码运行次数:0
运行
复制
defmodule Category.Function do
  def compose(f, g) do
    arity_f = :erlang.fun_info(f)[:arity]
    arity_g = :erlang.fun_info(g)[:arity]

    case {arity_f, arity_g} do
      {1, 1} ->
        &(g.(f.(&1)))
      arities ->
        raise "Function are not of arity 1, got #{arities}"
    end

  end
end

defimpl Category.Functor.P, for: Function do
  defdelegate map(f, g), to: Category.Function, as: :compose
end

它位于Getting Started的协议部分

http://elixir-lang.org/getting-started/protocols.html

票数 1
EN

Stack Overflow用户

发布于 2016-03-08 03:24:48

你的例子对我来说意义不大,因为在elixir中只有一种类型的函数,但是函数是一种你可以实现协议的类型。

代码语言:javascript
代码运行次数:0
运行
复制
defimpl Category.Functor, for: Function do
  def fmap(f, g), do: &(g.(f.(&1))
end

我看到的问题是,在Elixir/Erlang中,数量是非常重要的,我不知道如何以直接的方式说明这一点。

票数 1
EN

Stack Overflow用户

发布于 2016-03-06 04:22:04

因为Erlang/Elixir是动态类型的,所以严格的答案是否定的。函数实际上只通过数量来区分(或者对于命名的函数、模块、函数名称和数量)。

您可以通过Typespecs指定更具体的类型,dialyzer (通过dialyxer在混合任务中可用)将对此进行一些断言,但这不是编译工具链或运行时的一部分,也不提供任何保证。并不是所有的违规行为都会被dialyzer捕捉到(它基于成功的输入),但这是一个很好的开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35819319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档