ในฐานะที่เป็นแฮ็กเกอร์ Haskell ฉันชอบสัญกรณ์ pointfree มากกว่าประเด็น น่าเสียดายที่บางคนพบว่าโน้ตที่ไม่มีจุดอ่านยากที่จะอ่านและฉันพบว่ามันยากที่จะรับวงเล็บที่ถูกต้องเมื่อฉันเขียนแบบไม่มีจุดหมาย ช่วยฉันแปลงโค้ดที่เขียนด้วย pointfree เป็นเครื่องหมายที่ไม่มีจุดหมาย!
เกี่ยวกับ
ในสัญกรณ์ pointfree เราใช้ points (ใช่จริง ๆ ) เพื่อป้อนข้อมูลผลลัพธ์ของฟังก์ชันหนึ่งไปยังอีกฟังก์ชัน พูดว่าถ้าคุณมีฟังก์ชั่นsucc
ที่ใช้ตัวเลขและบวก 1 กับมันและคุณต้องการสร้างฟังก์ชันที่บวก 3 เข้ากับตัวเลขแทนที่จะทำสิ่งนี้:
\x -> succ(succ(succ(x)))
คุณสามารถทำสิ่งนี้:
succ.succ.succ
Pointfree ใช้งานได้กับฟังก์ชั่นที่ใช้พารามิเตอร์เดียวเท่านั้น (ในความท้าทายนี้ต่อไป) ดังนั้นหากฟังก์ชั่นของเราไม่ได้เป็นsucc
แต่add
ใช้หมายเลข 2 และรวมเข้าด้วยกันเราจะต้องป้อนมันอาร์กิวเมนต์จนกว่าจะเหลือเพียงหนึ่ง:
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
(+).(*3)
เหมือนกับ\x y->3*x+y
(.).(.)
ซึ่งแปลงเป็น\i b c f -> i (b c f)
.
ด้วย a (
, เติม a \x
และผนวกส่วนที่เกี่ยวข้องx
และมาก)
เท่าที่ต้องการ? หรือมันมีความซับซ้อนมากกว่านั้น?
\ d->f(\k->f(f d k))
แต่คุณสามารถสรุปได้ว่าจุดทั้งหมดได้รับการโต้แย้งสองข้อในการท้าทายนี้