在Haskell中,为什么我们不能撰写show和fst

时间:2018-10-18 15:31:18

标签: haskell

我期望show.fst (1,2)工作。但是很惊讶地看到它给出了例外。

在运行单个fst (1,2)时返回1::Num a => a,而show 1将1打印为字符串

show.fst $ (1,2)

工作正常。更加令人困惑,因为我看不到如何进一步减少元组(据我了解,当我们希望对表达式的正确部分求值时,使用$运算符。

2 个答案:

答案 0 :(得分:10)

在Haskell中,函数应用程序的优先级高于任何运算符,因此

show . fst (1,2)

解析为

show . (fst (1,2))

而且,由于fst (1,2) == 1不是函数,所以很难用任何东西组成它。


$运算符实际上只是函数应用程序,但是优先级很低。相比之下,这意味着

show . fst $ (1,2)

如果解析为

(show . fst) $ (1,2)

这似乎是您想要的。

答案 1 :(得分:6)

因为.的优先级低于函数应用程序的优先级,所以show.fst (1,2)等于show . (fst (1,2)),等于show . 1,与{{1} }不是函数。