Haskell'deki en kısa a -> b -> (a -> b) fonksiyonu


19

Bir testte şu soruyu aldım:

fAşağıdaki türde bir işlev yazın a -> b -> (a -> b). ave bherhangi bir anlamda bağlı olmamalı, kod ne kadar kısa olursa o kadar iyidir.

Ben geldim f a b = \x -> snd ([a,x],b). Daha küçük bir şey bulabilir misin?

Şu anda kazanan: f _=(.f).const


Eğer daha genel bir türüne izin verilir: f = const const.
hammar

@hammar: ya f _ b _ = bama, söz konusu çözüm göz önüne alındığında, ben daha genel bir tipi şüpheleniyorsanız değil izin verdi.
Tikhon Jelvis

6
Daha genel bir türe izin veriliyorsa, neden olmasın f = id?
Tom Ellis

7
Aslında daha genel bir tipe izin verilirse f = fbir çözümdür, bu yüzden sanırım tipteki koşullar çok önemlidir!
Tom Ellis

2
Daha genel bir türe izin verilmez, varsayımlarınız doğrudur.
Radu Stoenescu

Yanıtlar:


11

Örneğiniz sağ taraftaki anonim işlevden kurtularak küçültülebilir:

f a b x = snd ([a,x],b)

Bu, tür Haskell'e a -> b -> a -> beşdeğer olduğu için çalışır a -> b -> (a -> b).


4
Biraz daha kısa değişiklik:f a b x = snd (f x,b)
Ed'ka

5

Fonksiyon f _=(.f).constdaha genel tipteki aslında f :: a -> b -> (a -> b)yani f :: a -> b -> (c -> b). Herhangi bir tür imzası verilmezse, tür çıkarım sistemi bir tür ihlal eder f :: a -> b -> (a -> b), ancak f :: a -> b -> (c -> b)aynı imzayla tür imzasını eklerseniz , Haskell bunu sorunsuz bir şekilde derler ve f'nin kısmi uygulamaları için tutarlı türler bildirir. Muhtemelen tip çıkarsama sisteminin bu durumda tip kontrol sisteminden daha katı olmasının derin bir nedeni vardır, ancak bunun neden böyle olması gerektiğine dair bir neden bulmak için yeterli kategori teorisini anlamıyorum. Eğer ikna olmuyorsanız, kendiniz deneyebilirsiniz.


gibi olabilir f a b = f a a. tipe a -> a -> buygun olmasına rağmen tipte olması gerekir a -> b -> c. çünkü fbir tür verilmezse kendisini sadece monomorfik olarak kullanabilir.
proud haskeller

Bunun önemli olması gerektiğini düşünmüyorum
gururlu haskeller

4

Verilen ScopedTypeVariables, ben bu ile geldi:

f (_::a) b (_::a) = b

Hem fonksiyonumu hem de seninkini küçültürsen benimki saçlarım daha kısadır:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

Tabii ki, muhtemelen güvenmenize izin verilmiyor ScopedTypeVariables: P.


3
Bu f _=(.f).const( Sassa NF nedeniyle) kadar kısa değil . Bu da ihtiyaç duymaz ScopedTypeVariables.
counterclockwis

Hmm, başlangıçta bunun ilk ve üçüncü argümanların liste olmasını gerektireceğini düşündüm ...
Chris Taylor

@ChrisTaylor: Akılda çok fazla OCaml var mı? :)
Tikhon Jelvis

Hah, olmalı! ;)
Chris Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.