2017-05-31 49 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 (/)