好吧,你可能在想“为什么 Haskell 开发人员会对 Elixir 感兴趣?” 或“世界上没有多少 Haskell 开发人员,所以本指南不会那么有用”,主要原因是我只想更多地谈论 elixir 以及与 Haskell 的异同,这与未来的使用无关 除了材料之外,Elixir 也是一门非常不错的语言,并且拥有一个充满活力的社区,可以激励社区为传播 Elixir 的词做出贡献。 还有“为什么不给 Elixir 程序员的 Haskell 语言有很多事情要做来传播语言并使社区变得更强大。
既然我正确地介绍了原因,让我们从基础开始:
Elixir是什么?
Elixir 是一种运行在 Erlang 虚拟机中的函数式语言,由原 plataformtech(被 nubank 收购)的 José Valim 创建,Elixir 也受到 Ruby 的极大启发(José Valim 曾是 rails 核心团队的成员), Clojure(Valim 决定应用宏来使语言具有可扩展性)和 Erlang(并发角色模型的风格更易于人类理解,并且 Erlang VM 的所有功能都是容错和自我修复的)。
最基本的
如果没有对函数的强调,这将不是一个正确的函数式语言介绍,让我们来尝尝 elixir 函数的语法:
defmodule Example do def hi() do IO.puts "Hello World" end endExample.hi()
为了能够在 Elixir 中使用模块函数,我需要首先创建一个模块(defmodule),然后定义我的函数(使用 def 关键字),并且要执行我只需要运行 Example.hi()(在 repl 并点击运行,它应该显示 hello world)。
如果您认为语法中有一些类似 c 的代码,您猜对了,这就是 Ruby 语言中我们必须打开和关闭块的灵感,但稍后我们将看到一些方法可以不将这些块全部键入。
Haskell 中的等价物
module Examplehi = print "Hello World"
匿名函数
与 Haskell 不同的是,Elixir 区分了模块函数和匿名函数,而在 Haskell 中两者在底层是平等的。
Haskell 中的示例
domath x = x + 3-- is equal to(\x -> x+3)example = do print $ map (domath) [4] -- outputs [7] print $ map (\x -> x+3) [4] -- outputs [7]
虽然 Elixir 中的等价性是不可能的:
defmodule MathMod do def do_math(x) do x+3 end def example() do IO.inspect Enum.map([4], do_math) end endMathMod.hi(4) # outputs 7 MathMod.example() # outputs an error because passing module functons as a parameter generates an error
为了能够将函数作为参数传递,我需要指定一个匿名函数,如下所示:
defmodule MathMod do def do_math(x) do x+3 end def example() do IO.inspect Enum.map([4], fn x -> x+3 end) end endMathMod.example() # outputs [7]
同样在函数之间的这种区别中,Elixir 没有自动柯里化,所以我们必须手动柯里化我们的函数,并且只能柯里化匿名函数:
anFunc = fn x -> fn y -> x+y end endIO.puts anFunc.(3).(4) # outputs 7
缩短我们的功能
正如我之前提到的,我们可以通过不编写一些 open-close 父级或代码块来节省一些时间:
defmodule MathMod do def do_math(x) do x+3 end end# is equal todefmodule MathMod do def do_math(x), do: x+3 end
并且:
defmodule MathMod do def example() do IO.inspect(Enum.map([4], fn x -> x+3 end)) end end# is equal todefmodule MathMod do def example, do: IO.inspect Enum.map([4], &(&1+3)) #notice that &1 # is an alias for the first parameter(the x) if our function had # more parameters the alias would be &2, &3...&n end
我认为对于 Elixir 的第一口,我们涵盖了很多东西,可能这不是最适合初学者的开始方式,但如果你熟悉 Haskell,我会尽量让它最熟悉,我不 不知道我是否会继续并将其变成一个系列,但我仍然希望以某种方式为您的学习之旅做出贡献。
谢谢阅读!
到此这篇程序员的hello world_JAVA维苏威的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jjc/2375.html