Apa cara terpendek kita dapat mengekspresikan fungsi
f(a,b)(c,d)=(a+c,b+d)
dalam notasi point-free?
pointfree.io memberi kita
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
yang dengan sedikit kerja bisa disingkat
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
untuk 76 byte. Tapi ini sepertinya masih sangat panjang dan kompleks untuk tugas yang sederhana. Apakah ada cara kami dapat mengekspresikan penambahan berpasangan sebagai fungsi bebas titik yang lebih pendek?
Agar jelas dengan apa yang saya maksud dengan point-free, deklarasi point-free dari suatu fungsi melibatkan pengambilan fungsi dan operator yang ada dan menerapkannya satu sama lain sedemikian rupa sehingga fungsi yang diinginkan dibuat. Backticks, kurung dan nilai-nilai literal ( []
, 0
, [1..3]
, dll) diperbolehkan, tetapi kata kunci seperti where
dan let
tidak. Ini berarti:
Anda tidak boleh menetapkan variabel / fungsi apa pun
Anda tidak boleh menggunakan lambdas
Anda tidak boleh mengimpor
(+)***(+)
.(+)<$>([1],2)<*>([3],4)
memberi([1,3],6)
.Jawaban:
44 byte
Dapat ini dari
\x y -> (fst x + fst y, snd x + snd y)
Cobalah online!
sumber
44 byte
-8 byte berkat Ørjan Johansen. -3 byte terima kasih kepada Bruce Forte.
Cobalah online!
Diterjemahkan ke:
67 byte
-8 byte berkat Ørjan Johansen. -1 byte terima kasih kepada Bruce Forte.
Jika output tuple diperlukan:
Cobalah online!
Yup, saya melakukannya secara manual tidak menghasilkan buah matang. Tapi saya senang dengan
[a] → (a, a)
pertobatannya.Sekarang jika ada fungsi pendek dengan
m (a → b) → a → m b
.sumber
mapM id[fst,snd]
lebih pendek.mapM id
adalah versi golf dari fungsi yang mungkin Anda carisequence
,.(<*>)
tanda tangan yangm (a → b) → m a → m b
. Begitu dekat ...Control.Lens.??
, yang mungkin telah diusulkan untuk dimasukkan dalam basis di beberapa titik.(.mapM id[fst,snd])
seperti berulanglet r=(.mapM id[fst,snd]) in r(r.zipWith(+))
, tapi saya belum bisa mendapatkan typechecker untuk menerima versi pointfree.54 byte
Jujur saya ragu bahwa kita akan mengalahkan solusi 44 byte @ H.PWiz, tetapi tidak ada yang menggunakan fakta yang
(,)
mengimplementasikan kelas tipeFunctor
, jadi inilah yang menarik yang tidak terlalu buruk:Cobalah online!
Penjelasan
Implementasi kelas tipe
Functor
untuk 2 -Tupel sangat mirip denganEither
(dari basis-4.10.1.0 ):Apa artinya ini untuk tantangan ini, adalah bahwa fungsi berikut menambahkan elemen kedua sambil mempertahankan elemen pertama dari argumen kedua:
Jadi seandainya kita punya pembantu kecil,
helpPlz = \a b -> (fst a+fst b,snd b)
kita bisa(helpPlz<*>).flip(fmap.(+).snd)
dan akan selesai. Untungnya kami memiliki alatpointfree
yang memberi kami:Jadi dengan hanya memasukkan fungsi itu kembali kita sampai pada solusi di atas (perhatikan apa
(<*>) = ap
yang ada di dasar ).sumber
60 byte
Saya tidak melihat
uncurry
cinta di sini, jadi saya pikir saya akan muncul dan memperbaikinya.Saya pikir, dengan semua
fst
dansnd
, bahwa membongkar argumen denganuncurry
mungkin menghasilkan beberapa hasil. Jelas, itu tidak berbuah seperti yang saya harapkan.sumber
uncurry
sangat bertele-tele. :( Tetapi Anda dapat mengganti kurung terluar dengan$
.