首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >免费Monad中的多态教学

免费Monad中的多态教学
EN

Stack Overflow用户
提问于 2015-10-24 13:53:49
回答 1查看 219关注 0票数 4

我正在试着编译这小块代码。

代码语言:javascript
复制
module Sodium where

import Prelude
import Control.Monad.Free
import Data.Coyoneda
import Data.Tuple

data ReactiveF more
  = RFNewEvent (forall a. (Tuple (Event a) (a -> Reactive Unit) -> more))

type Reactive a = FreeC ReactiveF a

data Event a = Event a

newEvent :: forall a. Reactive (Tuple (Event a) (a -> Reactive Unit))
newEvent = liftFC $ RFNewEvent id

如果我在RFNewEvent中使用"Number“而不是"a”,那么一切都编译得很好。但就在我“追求一切”的那一刻。并将“数字”改为"a“,不再编译。

我收到以下错误消息

代码语言:javascript
复制
Cannot unify type
  a1
with type
  a0

有人知道怎么做吗?

我用的是0.5.0版的免费纯文本。

编辑

如果我使用以下方法

代码语言:javascript
复制
data NewEventData = NewEventData forall a. Tuple (Event a) (a -> Reactive Unit)

并将其替换为RFNewEvent,然后进行编译。但是我最终得到了一个不想要的newEvent类型签名。

代码语言:javascript
复制
newEvent :: Reactive NewEventData
newEvent = liftFC $ RFNewEvent id

它允许我创建一个事件,但允许我将不同的事件值拍摄到事件流,而不是相同类型的值。(失踪的a.现在newEvent上)

我可能犯了个错误。

总体目标是模拟SodiumFRP的界面使用一个自由Monad。然后插入一个现有的JavaScript玻璃钢库,工作类似于钠通过FFI解释自由Monad。

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-24 23:37:10

下面的代码现在编译"newEvent“并具有所需的类型签名

代码语言:javascript
复制
module FRP.Sodium where

import Prelude
import Control.Monad.Free
import Data.Coyoneda
import Data.Tuple

data ReactiveF more
  = RFNewEvent (NewEventData -> more)

type Reactive a = FreeC ReactiveF a

data NewEventData = NewEventData forall a. Tuple (Event a) (a -> Reactive Unit)

data Event a
  = ENever
  | EMerge (Event a) (Event a)
  | EFilterJust (Event (Maybe a))
  | ECoalesce (a -> a -> a) (Event a)
  | EOnce (Event a)
  | ESplit (Event (Array a))
  | EVar Int

data Behaviour a = BVar Int

extractNewEventData :: forall a. NewEventData -> (Tuple (Event a) (a -> Reactive Unit))
extractNewEventData (NewEventData x) = x

newEvent :: forall a. Reactive (Tuple (Event a) (a -> Reactive Unit))
newEvent = map extractNewEventData $ liftFC $ RFNewEvent id

编辑

也尝试了纯文本-存在。使定义“样本”成为可能

RFSample被添加到ReactiveF ..。

代码语言:javascript
复制
.
.
.
data ReactiveF more
  = RFNewEvent (NewEventData -> more)
  | RFSample (SampleData more)
.
.
.
data SampleDataF more a = SampleDataF (Behaviour a) (a -> more)
type SampleData more = Exists (SampleDataF more)

sample :: forall a. Behaviour a -> Reactive a
sample beh = liftFC $ RFSample $ mkExists $ SampleDataF beh id

谢谢菲尔·弗里曼的评论。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33318973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档