2013-12-19 60 views
10

我想了解部分,並認爲我已經明白了。基本上它是將部分應用程序應用於二元運算符的一種方法。所以我明白了所有的(2*),(+1)等例子就好了。部分 - 爲什麼我需要在這裏?

但在O'Reilly的真實世界哈斯克爾書,第「部分的」 :)它有這個例子:

(`elem` ['a'..'z']) 'f' 
>True 

我明白了括號的需要 - 即部分語法。但爲什麼我需要反引號?

如果我嘗試,我得到:

(elem ['a'..'z']) 'f' 

<interactive>:220:19: 
    Couldn't match expected type `[[Char]]' with actual type `Char' 
    In the second argument of `elem', namely 'f' 
    In the expression: (elem ['a' .. 'z']) 'f' 
    In an equation for `it': it = (elem ['a' .. 'z']) 'f' 
+0

我認爲你對coypasting做了一個錯誤:你的第二個例子應該是沒有'elem'反引號,並且沒有'> True'作爲答案。 – enrique

+0

@enrique對不起,我已更正。 –

回答

29

在Haskell中,反引號把一個名字中綴運算符:

a `elem` b = elem a b 

所以

(`elem` b) a = (\x -> x `elem` b) a 
      = a `elem` b 
      = elem a b 

雖然

(elem b) a = elem b a 
+0

太棒了 - 謝謝。 –

+4

使用反引號在部分中反轉函數的參數很常見,但它可以說是一種黑客攻擊,並且更清晰地使用「flip」。 – pash

+0

@pash:我絕對同意(我很驚訝這個意見似乎並不常見),但我認爲'elem'是一個特殊情況:它被寫爲使用中綴,我*期望*看到它用那種方式。 'div'和'mod'是類似的例子。 –