Saya mendapat pertanyaan berikut saat ujian:
Tulis fungsi
f
dengan tipe berikuta -> b -> (a -> b)
.a
danb
seharusnya tidak terikat dalam arti apa pun, semakin pendek kode, semakin baik.
Saya datang dengan f a b = \x -> snd ([a,x],b)
. Bisakah Anda menemukan sesuatu yang lebih kecil?
Saat ini pemenangnya adalah: f _=(.f).const
code-golf
functional-programming
haskell
Radu Stoenescu
sumber
sumber
f = const const
.f _ b _ = b
, tetapi, mengingat solusi dalam pertanyaan, saya curiga jenis yang lebih umum tidak diperbolehkan.f = id
?f = f
adalah solusi, jadi saya kira kondisi pada jenis itu sangat penting!Jawaban:
Contoh Anda dapat menyusut dengan menyingkirkan fungsi anonim di sebelah kanan:
Ini berfungsi karena jenisnya
a -> b -> a -> b
setara dengana -> b -> (a -> b)
di Haskell.sumber
f a b x = snd (f x,b)
Fungsi
f _=(.f).const
sebenarnya dari jenis yang lebih umum daripadaf :: a -> b -> (a -> b)
, yaituf :: a -> b -> (c -> b)
. Jika tidak ada tanda tangan tipe yang diberikan, sistem inferensi tipe menyimpulkan tipef :: a -> b -> (a -> b)
, tetapi jika Anda menyertakan tanda tangan tipef :: a -> b -> (c -> b)
dengan definisi yang sama persis, Haskell akan mengkompilasinya tanpa masalah dan akan melaporkan tipe yang konsisten untuk aplikasi parsial dari f. Mungkin ada beberapa alasan mendalam mengapa sistem inferensi tipe lebih ketat daripada sistem pengecekan tipe dalam kasus ini, tetapi saya tidak cukup memahami teori kategori untuk muncul dengan alasan mengapa ini harus terjadi. Jika Anda tidak yakin, Anda dapat mencobanya sendiri.sumber
f a b = f a a
. itu menyimpulkan menjadi tipea -> a -> b
meskipun sesuai dengan tipea -> b -> c
. itu karena jikaf
tidak diberikan suatu tipe, ia hanya dapat menggunakan dirinya secara monomorfis.Mengingat
ScopedTypeVariables
, saya datang dengan ini:Jika Anda menyusutkan fungsi saya dan milik Anda, rambut saya lebih pendek:
Tentu saja, Anda mungkin tidak diizinkan untuk mengandalkan
ScopedTypeVariables
: P.sumber
f _=(.f).const
( karena Sassa NF ). Yang juga tidak perluScopedTypeVariables
.