2014-01-13 45 views
0

可變從Haskell的文檔:函數名VS在Haskell

標識符是詞法區分爲兩個命名空間(第1.4節):那些具有小寫字母開頭(可變 標識符)和那些以大寫字母 (構造函數標識符)開頭的字符。

所以含有恆定值的變量,即a=4和函數名稱添加add a b = a + b都是變量標識符,是真的嗎?我們可以說一個函數名是可變的嗎?

從另一個學術來源:

f (patter1)...(pattern2) = expression 

..where一個圖案可以是構造函數或變量,而不是限定的 函數

這是從哪裏獲得困惑。我可以做f g x其中g是一個函數,我再次看到函數名稱是一個變量。真正? 那麼它們與「沒有定義的定義函數」是什麼意思呢?

+1

不知道。第二個來源可能是誤導性或措辭不佳。無論如何,如果你的某個參數與一個定義的函數具有相同的名稱,那麼這個定義就會被隱藏起來。 – Sarah

+2

我認爲他們試圖與Prolog和朋友形成對比,在那裏你可以做像'foo(bar baz)= quux'這樣的事情,這意味着「當調用'foo'時,搜索一個值'baz', baz'將輸入輸出到'foo',然後輸出'quux'「。 Haskell不做這樣的廣義搜索;只有明顯的內射函數 - 構造函數 - 才能以這種方式「倒轉」。 –

回答

6

函數名稱可以是變量標識符,除非它是像+這樣的運算符。

這是關於詞彙事宜的聲明。 你不能從中推斷出函數名是一個變量。 (因爲一個變量是不是詞彙的事情。)

它是周圍的其他方法,比如在

f . g = \a -> f (g a) 

其中fg是變量,即名字綁定到一些未知的提前值,但我們知道這些值必須是函數。

+1

Infix操作符仍然可以像小寫標識符一樣「可變」,但您不能在模式匹配中使用它們。但例如(x:xs)= f q <:> fqu其中{(<:>)= f; fqu = foldr f xs}'很好。 – leftaroundabout

+0

謝謝。然而,我沒有明白你的意思,「變量不是一個詞彙的東西」 – t0ma5

+0

「詞彙」是指我們如何寫它,這是不同於「語義」的擔憂(它的含義)。變量是一個語義對象,它是一個賦值的引用。變量*標識符*是它的名字,是一個文本表示形式,我們可以使用這種形式進行詞彙表述,例如「不以大寫字母開頭」。 – misterbee

0

命名函數實際上只是一個全局變量,它的「值」恰好是一個函數。例如,

id x = x 

本來也可能被寫爲

id = (\ x -> x) 

哈斯克爾明確,使這兩者之間沒有區別。即使是類型簽名說它:

id :: x -> x 

所以id只是一個價值誰是值的類型x -> x(即功能)。

別人說了一些關於操作符不是變量的東西;這是不真實的。

let (<+>) = \ x y -> (x+y)/(x*y) in 5 <+> 6 

你甚至可以做一些完全可怕的像寫一個循環,其中的<+>內容通過每次循環變化。 (但爲什麼有人會這樣做?)