2017-05-31 50 views
2

我試圖找出的f x y = 3 + y/x點遊離形式在Haskell。我認爲這將是f = (3.0+) . flip (/),但得到的答覆是f2 = curry $ (3.0+) . (uncurry $ flip (/)),這是一樣的f1 = curry ((3.0+) . (uncurry (flip (/)))),例如我得到的答案,但在開始之前翻轉和咖喱之前,uncurry。˚FX Y = 3 + Y/X在點遊離形式

我看到的版本是如何工作的,但我不知道爲什麼需要咖喱和uncurry功能,爲什麼我的版本也不行?該類型的(3.0+)a -> a,我認爲,如果你喂通過函數組合的結果形式flip (/)該功能的工作,但(3.0+) . flip (/) 2 10導致錯誤(爲什麼?),並不會產生8.是不是多餘的uncurry和然後再次咖喱?

+0

HTTPS ://hackage.haskell.org/package/pointfree – Hapal

回答

4

.所述的類型簽名是(.) :: (b -> c) -> (a -> b) -> a -> c。正如你所看到的,這只是工作,如果該第二功能(在你的答案flip (/))具有一個參數。在情況下,它有兩個參數,我們可以使用「貓頭鷹操作」 (.) . (.),其中有一個類型:

(.) . (.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c 

或者我們可以使用鑽營。通過在flip (/)部分使用uncurry :: (a -> b -> c) -> (a, b) -> c,我們構建了一個函數:

uncurry (flip (/)) :: Fractional c => (c, c) -> c 

所以現在我們用一個元組(因此一個參數)的工作,然後我們使用curry :: ((a, b) -> c) -> a -> b -> c爲「解壓」所得到的第一個參數元組再次。

替代

如前所述,我們可以使用貓頭鷹操作

((.) . (.)) (3.0+) (flip (/)) 
--^ owl ^

或者我們可以使用貓頭鷹操作的語法更加複雜的版本:

((3 +) .) . flip (/)