优秀的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
这会使-> String
与fullName
同一章的摘录(强调我的):
main是一个带副作用的计算,可以在任何副作用中运行 支持随机数生成和控制台IO的环境, 和任何其他类型的副作用,以及返回类型的值 单元
答案 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
的定义不匹配)Eff
将main
作为参数(但它会来自哪个?)Eff
仅返回main