[erlang-questions] Matthew Sackman's "cut" proposal

Richard O'Keefe ok@REDACTED
Tue Jul 12 05:57:08 CEST 2011


On 12/07/2011, at 1:15 PM, Tim Watson wrote:
> 
>> As an occasional Haskell and SML programmer, I am certainly not
>> against Curried functions.  What I *am* against is an approach which
>> is ugly, confusing, and almost never applicable.
>> 
> 
> Can't disagree with you there.
> 
>> If Erlang syntax were generalised to
>> 
>>        ends_with(X)(Y) -> string:equal(string:right(Y, length(X)), X).
>> 
>> we could eliminate those three tokens.
>> 
>> What's more, we could do that *WITHOUT* any weird restrictions on
>>  - whether pattern matching is allowed in the fun
>>  - the form of the fun body
>>  - where the arguments appear in the fun body
>>  - the order in which the arguments appear in the fun body.
>> and *WITHOUT*
>>  - any weird non-intention-revealing tokens, whether '_' or '?'
>> 
> 
> Yes but you have to admit, it does look a bit odd.

Yes, but that is precisely because it looks just like other languages
that do Curried functions.

	ends_with (x) (y) = rtake y (length x) == x

is perfectly good Haskell, assuming an rtake function, and

	fun ends_with (x) (y) =
	        List.drop (y, length y - length x) = x

is perfectly good SML, or would be if it didn't crash when y is
shorter than x.

> Why can't I just
> use the variable 'Y' and let the compiler figure out that the function
> signature needs to change?

Because it is only in toy examples that a compiler *could* figure out
*how* the function signature needs to change.

>> If you want to do Haskell-like things, it doesn't make sense not
>> to do it in a Haskell-like way, and that is to say that
>> 
>>        <name>(<args1>)(<args2>)...(<argsn>) -> <body>
>> 
>> is equivalent to
>> 
>>        <name>(<args1>) ->
>>            fun (<args2>) ->
>>                ...
>>                fun (<argsn>) ->
>>                    <body>
>>                end
>>                ...
>>            end
>> 
>> *NO* new tokens!
>> *NO* weird restrictions!
>> Good consistency with the way Clean and ML and Haskell do it.
>> *NO* changes elsewhere in the language.
>> 
> 
> Great - is it going to get through the eep process? Do we need to vote
> on it, contribute (e.g., test proposed patches, etc) or whatever?

I don't have time to write up an EEP today, but I'll see what I can do.
The nice thing about it is that it's entirely in the front end; the
rest of the compiler doesn't need to know anything about it.

> 
>> Let's see what we have to do now:
>> 
>> c(F1, F2) -> fun (X) -> F2(F1(X)) end.
>> c(F1, F2, F3) -> fun (X) -> F3(F2(F1(X))) end.
>> c(F1, F2, F3, F4) -> fun (X) -> F4(F3(F2(F1(X)))) end.
>> 
>> doodle(X) ->
>>    F = c(fun do_thing/1,
>>          fun calculate_next_thing/1,
>>          fun get_bored_of_typing_result_x,
>>          fun start_getting_annoyed_with_lazy_programmers/1),
>>    {ok, F(X)}.
>> 
>> Nope, not hard.  Trivial, in fact.
> 
> Boilerplate.

No, library code, done *ONCE*.
The only "boilerplate" would be the
-import(compose, [c/4]). % plus any others you want
line.

It would, in fact, have precisely the same status as function
composition in Haskell and SML.  Library code.

>> The question is, in a language without static types, how do you
>> tell the difference between an intentional foo/2 meaning a function
>> and an erroneous foo/2 that should have been Foo/2, with Foo a
>> variable bound to a number.
> 
> We're never going to get static types in Erlang, so I think the answer
> is that you'd end up with a failing unit or integration test case. Not
> sure how to do a "raised eyebrow" smiley.

We *have* optional static types in Erlang, but you're right that they
will probably never be mandatory.

Testing and static checking are complementary tools.
We need both.  Thank goodness we *have* both in Erlang.

> The compiler knows full well that (<module>)<name>/<arity> evaluates
> to a fun!?

Only if preceded by 'fun'.





More information about the erlang-questions mailing list