为什么我不能直接管道进入Elixir String.length。为什么我必须将它包装在另一个函数中?

时间:2016-08-22 18:31:40

标签: elixir

为什么这不起作用:

iex(2)> Enum.map(["the", "huge", "elephant"], String.length)
** (UndefinedFunctionError) function String.length/0 is undefined or private. 

但这样做:

iex(2)> Enum.map(["the", "huge", "elephant"], fn x -> String.length(x) end) 
[3, 4, 8]

我的意思是,String.length是一个函数,对吧?就像我的匿名包装一样?或者根据错误消息是否存在某种范围问题?

我对另一种功能性(ish)语言的唯一体验是R,这样可以正常工作:

> sapply(c("the", "huge", "elephant"), nchar)
     the     huge elephant 
       3        4        8 
> sapply(c("the", "huge", "elephant"), function(x) nchar(x))
     the     huge elephant 
       3        4        8 

1 个答案:

答案 0 :(得分:5)

String.length是一个函数但是由于Elixir允许调用没有括号的函数,当你键入String.length时,你实际上并没有得到一个函数,而是调用该函数的结果为0参数。您必须使用&module.function/arity语法:

iex(1)> Enum.map(["the", "huge", "elephant"], &String.length/1)
[3, 4, 8]