标签: purescript

什么是Eff和Aff?

Purescript类型EffAff?之间有什么关系?它们之间可以转换吗?

我刚开始使用来自Haskell的Purescript,看起来两种类型大致都是IOHaskell中的角色.说得公平吗?

purescript

27
推荐指数
1
解决办法
1724
查看次数

Haskell和PureScript有什么区别?

PureScript看起来与Haskell非常相似.在我看来,PureScript程序的大部分(主要是纯部分)也应该由Haskell编译器编译.是对的吗?

这导致了一个相关的问题:是否可以在Haskell服务器后端和PureScript前端之间共享代码,例如数据结构,表单验证?

haskell purescript

16
推荐指数
1
解决办法
3299
查看次数

我如何在打字稿中表达这一点?

假设我有一个界面A:

interface A {
  foo: number
  bar: string
}
Run Code Online (Sandbox Code Playgroud)

我有一个通用类型Option:

type Option<T> = {
  map: () => T
}
Run Code Online (Sandbox Code Playgroud)

然后我BA和创建一个新的界面Option:

interface B {
  foo: Option<number>
  bar: Option<string>
}
Run Code Online (Sandbox Code Playgroud)

如何让这个操作更通用?IE浏览器.我想要的API是:

type B = Lift<A>
Run Code Online (Sandbox Code Playgroud)

在哪里Lift自动将每个成员映射A到一个Option.请注意,A可以包含任意类型的任意数量的成员.

我该如何实施Lift?如果在TypeScript中无法做到这一点,那么有没有人有Scala/Haskell解决方案?

haskell types scala typescript purescript

15
推荐指数
2
解决办法
978
查看次数

PureScript FFI到摩卡

我试图将mocha绑定写入PureScript,我完全不知所措 Control.Monad.Eff

describe(function(){
  //do stuff  
});
Run Code Online (Sandbox Code Playgroud)

描述是一个不带任何东西并返回IO,或Eff或其他东西的函数(副作用没有返回值).


到目前为止我的尝试

foreign import describe 
  "function describe(n){         \
  \ return function(){           \
  \   window.describe(n); \
  \ };                           \  
  \}" :: forall eff a. Eff eff a -> Eff eff

foreign import describe "describe" :: forall eff a. Eff eff a -> Eff eff
foreign import describe "describe" :: Eff -> Eff
foreign import describe "describe" :: forall eff a. (a -> Eff eff) -> Eff eff
Run Code Online (Sandbox Code Playgroud)

显然遗漏了一些东西.请帮忙.

ffi mocha.js purescript

12
推荐指数
1
解决办法
777
查看次数

profunctors的哪些属性不能用于Haskell/PureScript?

在他们关于探测器光学的论文中,皮克林等人.说明

"profunctor"这个词来自类别理论,尽管很多分类结构在翻译中丢失了.

这对我来说似乎有点奇怪和独特,因为我所知道的其他代数结构(对,幺半群,仿函数,类别等)"似乎"在Haskell和PureScript等语言中遭受同样的命运 - 引用因为我很高兴被证明是错的.

不久之前,我和一些发明家一起玩了一下,发现它们很容易处理,特别是在光学方面.看到它们出现在monad变形金刚的背景下后,我的兴趣再次被选中.我需要重复这几次,因为我没有得到细节,但原则上它是非常清楚的.所以我不禁疑惑:

  • 那些属性是什么?他们为什么不在语言中实现?
  • 如果可能的话,需要付出多少努力才能将他们带入?
  • 这样做有什么好处?特别是,他们能帮助解决Ed在谈话结束时提到的问题吗?

haskell monad-transformers category-theory purescript profunctor

12
推荐指数
0
解决办法
283
查看次数

从不一致的JavaScript对象创建PureScript记录

假设我的PureScript代码中的用户记录具有以下类型:

{ id        :: Number
, username  :: String
, email     :: Maybe String
, isActive  :: Boolean
}
Run Code Online (Sandbox Code Playgroud)

CommonJS模块源自PureScript代码.导出的用户相关函数将从外部JavaScript代码调用.

在JavaScript代码中,"用户"可以表示为:

var alice = {id: 123, username: 'alice', email: 'alice@example.com', isActive: true};
Run Code Online (Sandbox Code Playgroud)

email可能是null:

var alice = {id: 123, username: 'alice', email: null, isActive: true};
Run Code Online (Sandbox Code Playgroud)

email 可省略:

var alice = {id: 123, username: 'alice', isActive: true};
Run Code Online (Sandbox Code Playgroud)

isActive可以省略,在这种情况下,假设true:

var alice = {id: 123, username: 'alice'};
Run Code Online (Sandbox Code Playgroud)

id 遗憾的是有时候是一个数字字符串:

var alice = {id: '123', username: 'alice'};
Run Code Online (Sandbox Code Playgroud)

上面的五个JavaScript表示是等效的,应该生成等效的PureScript记录.

如何编写一个带有JavaScript对象并返回用户记录的函数? …

purescript

11
推荐指数
2
解决办法
1385
查看次数

理解Reader monad

我正在通过示例阅读Purescript并介绍了阅读Monad的部分.这个例子是这样的:

createUser :: Reader Permissions (Maybe User)
createUser = do
  permissions <- ask
  if hasPermission "admin" permissions
    then map Just newUser
    else pure Nothing
Run Code Online (Sandbox Code Playgroud)

对我来说令人困惑的部分是ask功能.签名是:

ask   :: forall r. Reader r r
Run Code Online (Sandbox Code Playgroud)

它看起来好像是凭空创造了一个阅读器

当我读到Statemonad时,它的get功能与概念相同.文字解释说:

状态被实现为State monad的数据构造函数隐藏的函数参数,因此没有明确的引用传递.

我猜这是关键,同样的事情发生在这里与读者,但我不明白它是如何工作的......

当上面的例子运行时runReader,提供的值如何突然出现ask?Haskell文档ask说:检索monad环境.但我的困惑是从哪里来的?我看到它的方式,一个值传递给runReader,存储在某个地方,并得到它 - 你打电话ask......但这没有任何意义.

虽然这个例子是Purescript,但我猜测任何有Haskell识字的人也能够回答,因此Haskell标签.

monads haskell state-monad reader-monad purescript

11
推荐指数
1
解决办法
790
查看次数

如何使用类型系统编码和实施合法的FSM状态转换?

假设我有一个Thing具有state属性的类型A | B | C,
并且合法的状态转换是A->B, A->C, C->A.

我可以写:

transitionToA :: Thing -> Maybe Thing

Nothing如果Thing处于无法过渡的状态,它将返回A.

但是我想定义我的类型,并且过渡函数的转换方式只能在适当的类型上调用.

一个选项是创建单独的类型,AThing BThing CThing但在复杂的情况下似乎不可维护.

另一种方法是将每个状态编码为它自己的类型:

data A = A Thing
data B = B Thing
data C = C Thing
Run Code Online (Sandbox Code Playgroud)

transitionCToA :: C Thing -> A Thing

这对我来说似乎更清洁.但是我发现A,B,C是函数,除了转换函数之外,所有的函数都可以被映射.

使用类型类,我可以创建像:

class ToA t where  
    toA :: t -> A Thing
Run Code Online (Sandbox Code Playgroud)

哪个看起来更清洁了.

是否有其他首选方法可以在Haskell和PureScript中使用?

haskell purescript

10
推荐指数
2
解决办法
741
查看次数

Purescript中的字符串连接

玩purescript并遇到字符串连接的奇怪问题.我已经加载和进口的Prelude,Data.List,Data.Maybe,和Data.String(也试过进口Data.Array),但PSCI仍然不能识别(++).这表明(++)任何一个导入的模块中都没有包含(在这种情况下,指向要导入的相应模块的指针),或者当我安装purescript并设置我的环境时会出现一些奇怪的问题.我发现后者不太可能,但嘿,我会保持我的考虑因素.

提前致谢!

string import functional-programming module purescript

10
推荐指数
1
解决办法
1548
查看次数

将数组转换为PureScript中的列表

XY问题

如何在PureScript中将数组转换为列表?

arrayToList :: forall a. Array a -> List a
arrayToList = ???
Run Code Online (Sandbox Code Playgroud)

实际问题

必须写这个功能吗?

既没有purescript-arrays也没有purescript-lists定义这样的函数,这让我想知道是否有一种惯用的方法来处理列表中的函数的上下文中的数组.

例如Matrix.getRow返回一个阵列需要被变换成一个列表PUX HTML元素(矩阵呈现为HTML的过程).做这个的最好方式是什么?

arrays list purescript

9
推荐指数
1
解决办法
1150
查看次数