(%?) :: Int -> (Int -> Int) -> Int
x %? f = f x
m :: Int -> Int
m v = v %? \z -> z * 2 %? \z -> z + 3 %? \x -> x + z
或簡單爲什麼下面這個簡單的Haskell函數會給出一些奇怪的答案?
p :: Int -> Int
p v = v %? \z -> z * 2 %? \z -> z + 3
e.g,P 4 = 20
(%?) :: Int -> (Int -> Int) -> Int
x %? f = f x
m :: Int -> Int
m v = v %? \z -> z * 2 %? \z -> z + 3 %? \x -> x + z
或簡單爲什麼下面這個簡單的Haskell函數會給出一些奇怪的答案?
p :: Int -> Int
p v = v %? \z -> z * 2 %? \z -> z + 3
e.g,P 4 = 20
%?
具有太高的優先級和是左結合的,所以v %? \z -> z * 2 %? \z -> z + 3
相同v %? \z -> z * (2 %? \z -> z + 3)
。
如果你想%?
表現得像$
使用infixr 0 %?
,所以它具有相同的優先級和結合作爲$
。
這是非常快,謝謝! – user406288 2010-07-29 23:33:00
那麼,這將有助於知道你是什麼期待它做的。但也許這將有助於把一些明確的括號中p
:
q :: Int -> Int
q v = v %? (\z -> z * (2 %? (\z -> z + 3)))
或許你是你期待更多的東西是這樣的:
p2 :: Int -> Int
p2 v = v %? (\z -> (z * 2) %? (\z -> z + 3))
這可能是一個好主意,添加infix
聲明任何運營商你聲明,以避免這種混淆。算術運算符具有中高優先級,但是給定了函數的功能,您可能需要非常低的優先級。
作爲旁白 - 拉姆達達一直延伸到正確的位置,但我猜測這並不是什麼讓你失望。
偉大的工作,謝謝! – user406288 2010-07-29 23:33:23
這看起來很像作業... – intoverflow 2010-07-29 23:27:29