2015-03-13 58 views

回答

9

$運算符不是語法,它只是一個像其他所有函數一樣的普通函數。當你寫

1 :$ [2] 

第一個問題的編譯器看到的是,:$表現爲自身的經營者(考慮+ +++,這些都是非常不同的東西),但:$不被任何定義。

如果你寫

1 : $ [2] 

那麼編譯器不知道該怎麼辦,因爲你有兩個運營商緊挨着對方,這是不允許的,就像1 + * 2是不允許的。這些表達根本沒有任何意義。該$運營商實際上只是定義爲

f $ x = f x 

但它的優先級很低,像Please Excuse My Dear Aunt Sally算術運算符優先級,這樣就可以連鎖經營更容易。它實際上並沒有在表達式中插入圓括號。

+0

我認爲這個答案比我的更值得信任,但到目前爲止只有其他人加入了我的觀點。 – AndrewC 2015-03-13 16:00:23

+0

@AndrewC你的答案還是不錯的,你先把它貼出來,然後你提到了操作符部分,我沒有做到。這不像我介意代表,在這一點上,我沒有更多的特權,[我們在haskell標籤上匹配得非常好](http://data.stackexchange.com/stackoverflow/query/45578/top-100-users-in-a-given-tag)= P – bheklilr 2015-03-13 16:05:44

+0

非常感謝您的解釋。今天我學到了很多新東西。 – ssh 2015-03-13 17:58:20

6

$不會在任意代碼周圍放置括號,但會更改函數的評估順序(如圓括號)。

+0

好點。砰一聲。 (+1) – AndrewC 2015-03-13 15:23:25

10

你把$的功能和價值之間,並將其應用於函數的值。

1:不是函數,但(1:)是,所以你可以做(1:) $ [2]但不是1: $ [2]

(你得到的錯誤是因爲沒有空間,編譯器認爲:$是一回事,而不是兩個,並開始:運營商的數據構造,就像開始與首都功能是數據的構造函數。)

+0

感謝您的回答,並解釋了錯誤消息。你能解釋爲什麼':1'不是一個函數嗎?如果'1:[2]'給出'[1,2]',這意味着':'是'::: a - > [a] - > [a]'。通過currying'1:'會給'[a] - > [a]'這是一個函數。即使這是不正確的,那麼'()'是如何將它變成函數的? – ssh 2015-03-13 18:04:55

+1

它被稱爲操作員部分,它是部分應用程序的一種形式。運算符有兩個參數,但如果您提供其中一個參數並將其放在括號中,則編譯器將其視爲剩餘參數的函數,並且您可以執行通常對函數執行的任何操作。例子:'(+7)'是一個函數,它在字符串的前面添加了七個'(「Hi,」++)'',而'('':)'在字符串的前面放置了一個空格。 – AndrewC 2015-03-14 11:12:27

+1

非常感謝您的任期。我在這裏找到更多信息:https://wiki.haskell.org/Section_of_an_infix_operator – ssh 2015-03-16 14:45:09