PureScript看起来与Haskell非常相似.在我看来,PureScript程序的大部分(主要是纯部分)也应该由Haskell编译器编译.是对的吗?
这导致了一个相关的问题:是否可以在Haskell服务器后端和PureScript前端之间共享代码,例如数据结构,表单验证?
假设我有一个界面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)
然后我B
从A
和创建一个新的界面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解决方案?
我试图将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)
显然遗漏了一些东西.请帮忙.
在他们关于探测器光学的论文中,皮克林等人.说明
"profunctor"这个词来自类别理论,尽管很多分类结构在翻译中丢失了.
这对我来说似乎有点奇怪和独特,因为我所知道的其他代数结构(对,幺半群,仿函数,类别等)"似乎"在Haskell和PureScript等语言中遭受同样的命运 - 引用因为我很高兴被证明是错的.
不久之前,我和一些发明家一起玩了一下,发现它们很容易处理,特别是在光学方面.看到它们出现在monad变形金刚的背景下后,我的兴趣再次被选中.我需要重复这几次,因为我没有得到细节,但原则上它是非常清楚的.所以我不禁疑惑:
haskell monad-transformers category-theory purescript profunctor
假设我的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并介绍了阅读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)
它看起来好像是凭空创造了一个阅读器
当我读到State
monad时,它的get
功能与概念相同.文字解释说:
状态被实现为State monad的数据构造函数隐藏的函数参数,因此没有明确的引用传递.
我猜这是关键,同样的事情发生在这里与读者,但我不明白它是如何工作的......
当上面的例子运行时runReader
,提供的值如何突然出现ask
?Haskell文档ask
说:检索monad环境.但我的困惑是从哪里来的?我看到它的方式,一个值传递给runReader
,存储在某个地方,并得到它 - 你打电话ask
......但这没有任何意义.
虽然这个例子是Purescript,但我猜测任何有Haskell识字的人也能够回答,因此Haskell标签.
假设我有一个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中使用?
玩purescript并遇到字符串连接的奇怪问题.我已经加载和进口的Prelude
,Data.List
,Data.Maybe
,和Data.String
(也试过进口Data.Array
),但PSCI仍然不能识别(++)
.这表明(++)
任何一个导入的模块中都没有包含(在这种情况下,指向要导入的相应模块的指针),或者当我安装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的过程).做这个的最好方式是什么?
purescript ×10
haskell ×5
arrays ×1
ffi ×1
import ×1
list ×1
mocha.js ×1
module ×1
monads ×1
profunctor ×1
reader-monad ×1
scala ×1
state-monad ×1
string ×1
types ×1
typescript ×1