PureScript不构成`trace`和`show`

时间:2014-07-24 20:27:01

标签: javascript functional-programming purescript

以下作品

 main = do
    trace $ show $ 5

但这不是

 main = do
    (trace . show) 5

在psci中,跟踪的类型是

 forall r. Prim.String -> Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | r) Prelude.Unit

并且节目的类型是

 forall a. (Prelude.Show a) => a -> Prim.String

因为show的返回值是Prim.String,并且跟踪的第一个输入是Prim.String,所以它们应该是可组合的。 trace $ show通过类型检查进一步证明了这一点。但相反,我得到了这个错误:

Error at  line 1, column 10: 
Error in declaration it
Cannot unify Prim.Object with Prim.Function Prim.String.

我在这里缺少什么?现在我的心智模型是trace非常像Haskell中的putStrLn,并且一个绝对可以用show组成。 (putStrLn . show) 5有效。

跟踪和显示的预期组合结果类型:

 forall a r. (Prelude.Show a) => a -> Control.Monad.Eff.Eff (trace :: Debug.Trace.Trace | r) Prelude.Unit

1 个答案:

答案 0 :(得分:5)

.不是函数组合,而是PureScript中的property access,可以通过

看到
main = show $ { test : "Hello, string property" } . test

函数组合运算符可能在same operator in Control.Arrow (Haskell)之后调用<<<