pointfree를 pointful로 변환


9

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

1
"Pointfree는 단일 매개 변수를 사용하는 기능에서만 작동합니다." 사실은 아닙니다 :(+).(*3)\x y->3*x+y
Damien

2
@Damien 나는 도전에 대한 접근성을 높이려고 노력했습니다. : 당신은 또한 올빼미 같은 것들을 할 수 (.).(.)로 변환을\i b c f -> i (b c f)
BlackCap

2
하스켈의 구문을 잘 모르는 사람들을 위해 명료하게하기 위해 : 먼저 입력에서 괄호를 일치시키고 각 최상위 괄호로 묶은 표현에서 반복해야합니다. 그런 다음 각각 .을 a 로 바꾸고 (앞에 a \x를 추가하고 필요한 x만큼 추가하십시오 ). 아니면 그보다 더 복잡합니까?
피터 테일러

1
@Linus \ d->f(\k->f(f d k)),하지만이 도전에서 모든 점에 두 개의 인수가 주어 졌다고 가정 할 수 있습니다
BlackCap

답변:


4

하스켈, 163142133 바이트

p(x:r)|[a,b]<-p r=case[x]of"("->["(\\x->"++a++p b!!0,""];"."->['(':a++")",b];")"->[" x)",r];_->[x:a,b]
p r=[r,r]
f s=p('(':s++")")!!0

Ideone에서 사용해보십시오.

언 골프 드 :

p('(':r)|(a,b)<-p r = ("(\\x->"++a++(fst(p b)),"")
p('.':r)|(a,b)<-p r = ('(':a++")",              b)
p(')':r)            = (" x)",                   r)
p(x  :r)|(a,b)<-p r = (x:a,                     b)
p _                 = ("",                     "")

f s=fst(p('(':s++")"))

2

하스켈, 402 289 바이트

꽤 길지만 작동한다고 생각합니다 ..

(!)=elem
n%'('=n+1
n%')'=n-1
n%_=n
a?n=a!"."&&n<1
a#n=a!" ("&&n<1||a!")"&&n<2
q a='(':a++")"
p s o n[]=[s]
p s o n(a:b)|o a n=[t|t@(q:r)<-s:p""o(n%a)b]|0<1=p(s++[a])o(n%a)b
k=foldr((++).(++" ").f)"".p""(#)0
f t|not$any(!"(. ")t=t|l@(x:r)<-p""(?)0t=q$"\\x->"++foldr((.q).(++).k)"x"l|0<1=k t
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.