[英]How do you create an Effect in Purescript directly via its type constructor?
是否可以直接使用Effect
构造函数? 例如foo = Effect "howdy!"
看来这应该是可能的。 它似乎是一个类型构造函数。
:kind Effect
Type -> Type
但是,如果我尝试构造它,则会引发错误
Effect 1234
Unknown data constructor Effect
我只能创建一个“间接”的pure
myeffect :: Effect Int
myeffect = pure 123
我想念什么吗?
签名Effect :: Type -> Type
表示如果您使用Effect
一词并在其右边附加一个类型,则结果将是另一种类型。 所以:
Effect :: Type -> Type
Int :: Type
Effect Int :: Type
这并没有说明创建Effect
类型的值 。 那是:
Effect Int :: Type
x :: Effect Int
x = Effect 42 -- not necessarily allowed
对于许多类型,这恰好可以正常工作,例如:
Maybe Int :: Type
x :: Maybe Int
x = Just 42 -- perfectly valid
但这不是必须的。 这完全取决于类型的定义方式。 例如:
data MyType a = Foo
MyType :: Type -> Type
MyType Int :: Type
x = Foo 42 -- now allowed
y = Foo -- allowed
请注意,我使用单词Foo
构造MyType
值,而不是单词MyType
。 这是因为它们是不同的东西。 MyType
是类型的名称,而Foo
是构造函数的名称- 构造函数的名称可以构造(因此得名)一个类型的值。 构造函数的其他示例包括Just
和Nothing
-都用于构造Maybe
类型的值。
构造函数可以具有与类型本身相同数量的参数,也可以具有更少或更多的参数。 例如:
data Type1 a = Ctor1 a
data Type2 a = Ctor2
data Type3 a = Ctor3 a a
x :: Type1 Int
x = Ctor1 42
y :: Type2 Int
y = Ctor2
z :: Type3 Int
z = Ctor3 42 84
因此,总结一下:根据类型的定义方式,您可能会或可能不会使用类型的名称来创建该类型的值,这就是您尝试使用Effect
。
(同样,某些类型可能具有多个构造函数,例如data Maybe a = Just a | Nothing
,但这已经花费了太长时间)
但所有这些甚至都不适用于Effect
,因为...
Effect
工作方式 Effect
根本没有任何构造函数。 无论参数如何,绝对没有办法直接创建此类型的值。
这是因为Effect
是神奇的 。 Effect Int
类型的值绝对不是内部包含Int
的“盒子”。 不不不。
相反,类型为Effect Int
的值是一个程序 ,当执行该程序时,最终将产生一个Int
。 您不能看里面,也不能拆开它,唯一可以做的就是执行它。
以及如何执行呢? 简单! 您从main
函数返回它!
不,严重的是,这是执行Effect
的唯一方法。 (好吧,还有unsafePerformEffect
,然后您可以使用FFI来做到这一点,但是这些都是针对启动者的技巧,不要去那里)
执行效果的通常方法是从main
函数返回if,运行时会照顾好它。 繁荣!
另一种看待它的方法是您的整个程序是一个大(或小) Effect
。 那是你的程序。
您可以使用效果做的另一件事是使用运算符>>=
(或它的邪恶孪生=<<
)将其与另一个效果组合。 例如:
x = pure 40
y = x >>= \a -> a + 2
z = pure 42
在这里, y
和z
是等效程序:当执行时,两者都将产生数字42
。
这就是您在PureScript中编写程序的方式:从内置的(“魔术”)函数开始,这些函数会产生效果,例如cwd
或readLine
或其他任何东西,然后通过>>=
或=<<
或do
表示法( >>=
语法糖)。 然后,由许多小的结果构成的结果很大的效果,您将从main
函数中返回-瞧,您有了自己的程序!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.