. versus $ in haskell
Possible Duplicate:
Haskell: difference between . (dot) and $ (dollar sign)
好吧,我明白这一点:
可以重写:
也可以重写:
我不完全理解的是这两者在功能上没有重叠。我从概念上理解,它们并没有完全重叠,但有人能为我一次性地澄清这一点吗?
- 你看,你实际上不能像第二个例子中那样。谢谢!
- 此外,函数调用不需要parens(也不推荐)。总之,示例应该是f (g x)、f $ g x和(f . g) x。
- @Delhan或f . g $ x。
1 2 3 4
| Prelude> :t ($)
($) :: (a -> b) -> a -> b
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c |
$对一个值应用一个函数。.由两个函数组成。
所以我可以写f $ g x,即"应用f到(g of x)"或f . g $ x,即"应用f和g到x的组合"。一种常见的样式是将左边的点堆积起来,后面跟着一美元。原因是,f $ g $ x的含义与f . g $ x相同,但表达式f $ g本身往往没有意义(实际上,可能是类型错误),而表达式f . g的含义是"f和g的组成"。
- 对于无数的f和g来说,f $ g是完全可能的,类型也很好(考虑(\f -> f 0) $ (\x -> x + 1),它与f g完全相同。否则,请更正。
- @Delnan我想不出一个f $ g,它是在f $ g $ x的上下文中独立的良好类型。但这可能是想象力的失败。
- 如果f接受并返回一个函数,这是可能的。示例:const (f :: a -> b) $ (g :: c -> d) :: a -> b和const (f :: a -> b) $ (g :: c -> d) $ (... :: a) :: b。当然,很难找到一个有意义的/现实世界的例子,但是W.R.T.类型系统没有什么特别之处。
- 编辑以考虑您的观点。谢谢。
除了前面已经说过的,在这种情况下,您还需要$as"函数应用程序胶水":
1 2
| map ($3 ) [(4+), (5-), (6*), (+4), (*5), (^6)]
--[7,2,18,7,15,729] |
在这个例子中,(.3)和(3)都不起作用。
"f$g x"不能重写为"f"。"X"。实际上,编译器甚至不会接受第二个函数,因为"(.)"的类型是"(B->C->(A->B->(A->C)"。也就是说,第二个参数必须是一个函数,"g x"是一个值,而不是一个函数。
- g x是(curried)2元或更多元g的函数,例如const 0。
- @德尔南:是的,但我认为G是一元的,从他使用它的方式。