我想了解以下内容在完成点免费电话:Haskell函数组合 - (a - > b) - >(a - > c) - >(b - > c - > d) - >(a - > d)
withinBounds :: [Int] -> Bool
withinBounds xs = (all (>= 0) xs) && (all (<= 8) xs)
我明白,这是优于它这种方式可读性/理智的缘故写的,但我想更多地了解我如何可以撰写功能。我一直在挠我的脑袋,以至于我该如何做到这一点。 全体(扩大?)型签名
[Int] -> ([Int] -> Bool) -> ([Int] -> Bool) -> (Bool -> Bool -> Bool) -> Bool
我试图让该组合物的类型签名是
(a -> b) -> (a -> c) -> (b -> c -> d) -> (a -> d)
我写了下面作为一个私生子 - 拉姆达形式笔记。如果有一种方法在一定程度上简化与演算的问题,这将会是巨大的,如果可能太解释说:
\[email protected][] -> \[email protected]([] -> Bool) -> \[email protected]([] -> Bool) -> \[email protected](Bool -> Bool -> Bool) -> f3.(f1.L).(f2.L)
在上面,.
是应用程序,@
被捕获(使F3是另一种(Bool - > Bool - > Bool)的名称)。 非常感谢。
编辑:我知道这不是最优化或可重用的代码,我知道将其转换为无点代码会使其在可读性等方面变得更糟。为了澄清,我在问如何将其转化为点 - 免费,因为我想了解更多关于haskell和作文。
EDIT2:A really good SO answer on point-free
你'withinBounds'不是组合的,最好是写一个单一元素的检查,然后调用'all'上。实际上,我可能只需将inBounds内的'all withinBounds'内联到一个单独的元素中。 –
谢谢。是否有一个功能不可组合的迹象? (例如在身体的多个位置需要输入?) – MIJOTHY
@MIJOTHY:通常,如果类型更一般,它可能更易于重用,例如, 'withinBounds :: Ord e =>(e,e) - > e - > Bool; withinBounds(a,b)x = a <= x && x <= b'。现在你的原始函数只是'all(withinBounds(0,8))'。此外,我可以用它作为过滤器的谓词:'filter(withinBounds(4,100))[1..103]'。 – Zeta