繁体   English   中英

您如何直接通过PureScript的类型构造函数创建效果?

[英]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构造函数的名称- 构造函数的名称可以构造(因此得名)一个类型的值。 构造函数的其他示例包括JustNothing -都用于构造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

在这里, yz是等效程序:当执行时,两者都将产生数字42

这就是您在PureScript中编写程序的方式:从内置的(“魔术”)函数开始,这些函数会产生效果,例如cwdreadLine或其他任何东西,然后通过>>==<<do表示法( >>=语法糖)。 然后,由许多小的结果构成的结果很大的效果,您将从main函数中返回-瞧,您有了自己的程序!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM