【发布时间】:2015-05-15 00:14:32
【问题描述】:
此代码通过使用运算符部分说明了部分应用程序的使用:
gt100 :: Integer -> Bool
gt100 x = x > 100
greaterThan100 :: [Integer] -> [Integer]
greaterThan100 xs = filter gt100 xs
greaterThan100_2 :: [Integer] -> [Integer]
greaterThan100_2 xs = filter (\x -> x > 100) xs
greaterThan100_3 :: [Integer] -> [Integer]
greaterThan100_3 xs = filter (>100) xs
运算符部分 (>100) 部分地将运算符应用于一个 它的两个论点。所以这种情况下的操作符是 > 为什么这个部分应用作为 > 运算符被应用 到整个整数列表?
这与 lambda 表达式 (\x -> x > 100) 有何不同?
显然不是部分应用?
取自http://www.seas.upenn.edu/~cis194/spring13/lectures/04-higher-order.html
更新:
感谢答案,这看起来更清楚了。
所以现在是我的理解:
*Main> :t (>)
(>) :: Ord a => a -> a -> Bool
根本不应用,因为它接受两个参数“a -> a”但它们不应用。
*Main> :t (>100)
(>100) :: (Ord a, Num a) => a -> Bool
作为“a -> Bool”类型的函数被部分应用
*Main> :t (3>100)
(3>100) :: Bool
被评估为 Bool 类型,它是运算符 (>) 的返回类型,如 :t (>) 所示
【问题讨论】:
-
实际上并没有什么不同,因为它们都具有相同的类型和行为。
标签: haskell