11

Fonksiyon uygulamasının nasıl çalıştığını anlamakta zorluk çekiyorum. Ben şu fonksiyonu varsa:Haskell dolar işletmecisi uygulaması

($) :: (a -> b) -> a -> b 

Ben kısmen bu fonksiyonu uygulamak için ben (a -> b) fonksiyonunu ($ ilk argüman) sağlamak gerektiğini anlıyoruz.

neden sonra (yani, bağımsız değişkenler ters) ilk olarak bir değeri uygulamak mümkündür?

($ 0) :: Num a => (a -> b) -> b 

Burada nelerin eksik?

cevap

13

($):: Num a => (a -> b) -> b bir operatörüdür var. Haskell, her türlü operatör sol bölümünde yazılabilir (gibi (x $)) ya da sağ bölüm (gibi ($ x)):

(x $) = (\y -> x $ y) = ($) x 
($ x) = (\y -> y $ x) = flip ($) x 

Not Bu kuralın tek istisnası amacıyla (-) olduğunu elverişli negatif sayılar yazmaya: Eğer tersely (\y -> y - x) yazmak istediğiniz durumda

\x -> (x-) :: Num a => a -> a -> a -- equivalent to \x -> (-) x 
\x -> (-x) :: Num a => a -> a  -- equivalent to \x -> negate x 

, sen subtract kullanabilirsiniz:

\x -> subtract x :: Num a => a -> a -> a -- equivalent to \x -> flip (-) x 
+0

Teşekkürler, bu neden bu şekilde çalıştığını açıklıyor. Bu tanımlar dil özellikleri midir yoksa kaynaklarda bir yerlerde bulunabilir mi? – Rumca

+2

@Rumca Kaynakta gerçekten yok, (x $) ve ($ x) bölümler ve bunların bir açıklaması [2010 haskell raporunda] bulunabilir (http://www.haskell.org/onlinereport/haskell2010/) [bölümler bölümünde] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5). – Davorak

+0

Bu dil [Haskell 2010 Raporu] 'nda açıklanmıştır (http://www.haskell.org/onlinereport/haskell2010/). –

4

($ 0) ≡ ise ($) :: (a -> b) -> a -> b)(\x -> x $ 0)(\x -> ($) x 0)

ve biz (\x -> ($) x 0) gibi ikinci argüman uygulanan biz

2

Bir fonksiyonu ile bir operatörün infix gösterimini kafa karıştırıcıdır. İşte

> :t (($) (+1)) 
(($) (+1)) :: Num b => b -> b 

daha iyi anlaşılması için, $ ile ifadelerin bazı formları şunlardır:

a ve $ b => ($) ab

($ b) => Flip ($) b => (\ ba -> ($) ab) b => a \ -> ($) ab

(a $) => ($) a => \ b -> ($) ab

+0

-1 Bu sorunun ne hakkında olduğunu ve mantığın ne olduğunu tam olarak anlayan biri olarak bile, bu cevabı anlaşılamaz buluyorum. Haskell'i bilmeyen birisinin bunu nasıl anlaması gerekiyor? Operatörler ve fonksiyonlar arasındaki farkın hiç bir açıklaması yok. '$ b => çevir ($) b => \ a -> ($) a b' bile geçerli bir sözdizimi değildir. (Düzenleme: Tamam, biraz daha fazla temsilcisi olsaydı -1 olur.) –

1

Ayrıca Haskell sözdiziminde, alfasayısal adların noktalama isimlerinden ayırt edildiğini de unutmayın.

Alfasayısal işlev foo1 a b varsayılan olarak önektir ve backticks eklerseniz infix olur: a `foo` b.

$ veya <*> gibi bir noktalama adlı fonksiyon varsayılan olarak infix olduğunu ve parantez ($) veya (<*>) eklerseniz öneki olur. Bu, Latin alfabesini bilen programcı için sözdizimsel şekerdir; alfanümerik isimler ve noktalama isimleri arasında keyfi ancak yardımcı bir ayrımdır.

Her iki işlev de yalnızca işlev görür; bunlar, C++ veya Java'da "operatörler" için sahip olduğumuz özel anlamsal kurallara sahip değildir. Sadece noktalama-adlandırılmış işlevler ve alfasayısal adlandırılmış işlevler arasında farklı olan önek/infix ve backticks/parantez etrafındaki sözdizimi kuralları.