为什么Eff没有最后一个返回值的箭头

时间:2016-12-01 00:03:50

标签: purescript

优秀的PureScript book解释了

fullName :: forall r. Record (firstName :: String, lastName :: String | r) -> String
fullName person = person.firstName <> " " <> person.lastName

然后比较Eff monad

import Prelude

import Control.Monad.Eff.Random (random)
import Control.Monad.Eff.Console (logShow)

main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) Unit
main = do
  n <- random
  logShow n

我的问题是: 为什么main的签名在单位之前不包含->,即

main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) -> Unit

这会使-> StringfullName

的签名类似

同一章的摘录(强调我的):

  

main是一个带副作用的计算,可以在任何副作用中运行   支持随机数生成和控制台IO的环境,   和任何其他类型的副作用,以及返回类型的值   单元

1 个答案:

答案 0 :(得分:1)

两个函数之间的一个区别是<?php var_dump($_COOKIE); ?> 有一个参数(在fullName之前)。函数签名表明它需要一些记录并返回一个字符串。

->不接受任何参数,因为它是&#34;入口点&#34;对于应用程序,它返回main。因此Eff只返回一个类型。该类型碰巧有两个类型参数

函数参数和类型参数看起来完全相同,但它们位于不同的级别。采用参数的类型具有构造函数并应用其参数来生成实际类型。它看起来像功能应用程序,但在类型级别! &#34;签名&#34;类型被称为种类 ...你可以了解更多关于它的信息,但可以将其视为&#34;类型类型&#34;。

现在main是一种结合了一些效果和一些&#34;实际结果&#34;的类型。它的构造函数应用效果行作为第一个参数,结果类型作为第二个参数。在Eff的情况下,它所做的只是副作用,所以&#34;实际结果&#34;是main,基本上没什么。

如果Unit的签名是:

main

这意味着

  • main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) -> Unit 只将一些效果行作为类型参数(与Eff的定义不匹配)
  • Effmain作为参数(但它会来自哪个?)
  • Eff仅返回main