Haskell neden onu basit bir kütüphane işlevi olarak tanımlamak yerine “if / then / else” içinde yerleşik olarak kullanıyor?


25

Haskell'in neden basit bir kütüphane işlevi yerine türüne if/then/elsebağlı bir yerleşik Boolözelliği vardır? Gibi

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
Açıkça agda'da olduğu gibi mixfix fonksiyonları olmadan elde edemedikleri if / then / else sözdizimini istediklerini açıklarlar. Bahsettiğiniz işlev bir üçlü olarak yapılandırılmıştır, ancak bize / sonra / başka bir şekle (muhtemelen bir vaka üzerinde sadece şekerdir) verebildiklerini ve zararsız olduğunu bize verdiğimi varsaysam da uygulayabilirsiniz. Ama hiçbir şeyim yok Beni burada desteklemek için, bu yüzden bir yorum bu yazıyorum.
Jimmy Hoffa,

10
Bu, okuyucuların çoğunda açıkça görünse de, tembel olarak makul olsa da, bir fonksiyon olarak “/ sonra / başkasının” istekli bir dilde (örn. Şema veya sml) iyi bir çözüm olmayacağını belirtmek isterim. Haskell gibi bir dil.
Giorgio

Yanıtlar:


24

Bu güzel şeker için tamamı if, thenve elseanahtar kelimeler; Aslında, GHC ( RebindableSyntaxuzantısı etkinleştirilmiş), ifThenElsekapsamı ne olursa olsun işlevini çağırarak sözdizimini kaldırır .


6

Çok önemli değil ... benim için / o zaman / başka günlerde çok sık kullanılmamış gibi görünüyor. Kendimi örüntü gardiyanlarının izinde ... ... öyküsünde olduğunu biliyorum.

Bununla birlikte, sözdizimsel bir bakış açısına sahip olmak güzel

if expr1 then expr2 else expr3

Yani yazabilirsin

if foo a then bar b else baz c

yerine

if (foo a) (bar b) (baz c)

Bu da bana biraz LISPish görünüyor.

Anlamsal analiz ve kod oluşturma için, verimli makine koduna kolayca derlenebilecek bu yapıya sahip olmak güzeldir. Kodun, (değerlenmemiş) parametrelerin hepsinin geçirilmesi gereken bir işlev çağrısına karşılık olarak ulaşılmayan dal için serseri yapan kısmı atlayabileceğini unutmayın. Ama aynı zamanda thunk oluşturmak için zaman (ve daha sonra yeniden kazanılması gereken hafıza) mal olur. Bunu iyi yapmak için her yerde if işlevini satırlamak gerekir.


3
Yan çizginin gerçek bir sorun olduğunu sanmıyorum. Anladığım kadarıyla, GHC zaten küçük işlevlerin altını çizme konusunda son derece iyidir, çünkü Haskell'de böyle yaygın bir örnek.
Tikhon Jelvis

1
@TikhonJelvis Tabii ki, ancak / o zaman / başkasıyla, her zaman satır içi olması gereken özel bir işleve ihtiyacınız yoktur. Hatta bir geçiş koduna ihtiyacınız yoktur ve yine de düzgün kodlar oluşturabilirsiniz. Tüm dünya GHC değil.
Ingo
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.