Haskell 해커이기 때문에 나는 뾰족한 것보다 pointfree 표기법을 선호합니다. 불행히도 일부 사람들은 포인트 프리 표기법을 읽기가 어려워서 포인트를 쓸 때 올바른 수의 괄호를 얻는 것이 어렵다는 것을 알게되었습니다. pointfree로 작성된 코드를 pointful 표기법으로 변환 할 수 있도록 도와주세요!
약
포인트 프리 표기법에서는 포인트 (예, 실제로)를 사용하여 한 함수의 출력을 다른 함수에 공급합니다. 말, 당신은 함수가 있다면 succ
, 숫자를 받아 여기에 1을 추가하고 대신이 일을, 숫자 3을 추가하는 기능을 확인하고 싶었 :
\x -> succ(succ(succ(x)))
당신은 이것을 할 수 있습니다 :
succ.succ.succ
Pointfree는 우리의 기능은 아니었다 그렇다면, (어쨌든이 문제에) 그러나 하나의 매개 변수를 사용 기능을 작동하는 succ
것이 아니라 add
이 개 번호를 가지고 함께 추가되는, 우리가 하나가 남아있을 때까지 그것을 인수를 공급해야합니다 :
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
마지막으로 함수는 다른 함수를 인수로 사용할 수 있습니다.
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
입력 및 예상 출력
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
규칙
- 출력이 균형을 유지하는 한 필요한 것보다 더 많은 공백이나 괄호가있을 수 있습니다
- 생성 한 변수의 이름
\x
이 코드의 다른 곳에서 사용되지 않았 는지 확인할 필요 는 없습니다. - 함수를 만들 것인지 전체 프로그램을 만들 것인지 선택하십시오
- 이것은
codegolf
바이트 단위의 가장 짧은 코드입니다!
당신은 무딘 유용한 것을 발견 할 수 있습니다, 그것은 두 표기법 사이에서 변환합니다 (그러나 가능한 경우 코드를 분해합니다) : https://blunt.herokuapp.com
15
pointfree에서 우리는 다른에 하나 개의 함수의 출력을 공급하기 위해 포인트를 사용 표기법 명확하게 pointfree을 증명하기위한 시도이다 그 것은 무의미하지 않다
—
루이스 Mendo
"Pointfree는 단일 매개 변수를 사용하는 기능에서만 작동합니다." 사실은 아닙니다 :
—
Damien
(+).(*3)
\x y->3*x+y
@Damien 나는 도전에 대한 접근성을 높이려고 노력했습니다. : 당신은 또한 올빼미 같은 것들을 할 수
—
BlackCap
(.).(.)
로 변환을\i b c f -> i (b c f)
하스켈의 구문을 잘 모르는 사람들을 위해 명료하게하기 위해 : 먼저 입력에서 괄호를 일치시키고 각 최상위 괄호로 묶은 표현에서 반복해야합니다. 그런 다음 각각
—
피터 테일러
.
을 a 로 바꾸고 (
앞에 a \x
를 추가하고 필요한 x
만큼 추가하십시오 )
. 아니면 그보다 더 복잡합니까?
@Linus
—
BlackCap
\ d->f(\k->f(f d k))
,하지만이 도전에서 모든 점에 두 개의 인수가 주어 졌다고 가정 할 수 있습니다