阅读有关Eff语言的内容,我想知道是否有类似的想法已经在使用中.Eff-Language提到了一篇名为"推断代数效应"的论文,该论文描述了Eff用于推断效果的算法.有相似之处吗?
更新使用type
作品定义的记录,如与Haskell的差异中所述
type PointRec = { x :: Number, y :: Number }
setX :: Number -> PointRec -> PointRec
setX val point = point { x = val }
Run Code Online (Sandbox Code Playgroud)
但是当使用data
(并因此指定构造函数)定义时,它不会:
data PointRec = PointRec { x :: Number, y :: Number }
setX :: Number -> PointRec -> PointRec
setX val point = point { x = val }
Run Code Online (Sandbox Code Playgroud)
我从编译器得到的错误是
Could not match type
Run Code Online (Sandbox Code Playgroud)
和一些细节.
我能在这做什么?
我需要输出一个带前导零和六位数的数字.在C或Java中,我将使用"%06d"
格式字符串来执行此操作.PureScript是否支持格式字符串?或者我将如何实现这一目标?
我正在将History.js中的绑定写入PureScript,并且仍在努力理解Eff monad,一系列效果是什么以及为什么它们很有价值.现在我写了以下内容EasyFFI
type Title = String
type Url = String
type State = forall a. {title :: Title, url :: Url | a}
type Data = forall a. { | a}
type StateUpdater = Data -> Title -> Url -> Unit
-- this function is a work around for 'data' as a reserved word.
foreign import getData
"function getData(state){ return state['data']; }"
:: forall a b. { | a} -> b
unwrapState :: StateUpdater -> State -> Unit
unwrapState …
Run Code Online (Sandbox Code Playgroud) 我正在读purescript维基,发现下面的章节这也解释了do
在以下方面>>=
.
什么>>=
意思?
记谱法
do关键字为monadic表达式引入了简单的语法糖.
这是一个例子,使用monad作为
Maybe
类型:Run Code Online (Sandbox Code Playgroud)maybeSum :: Maybe Number -> Maybe Number -> Maybe Number maybeSum a b = do n <- a m <- b let result = n + m return result
maybeSum
取两个值类型Maybe Number
,如果两个数字都不是,则返回它们的总和Nothing
.使用do表示法时,返回类型必须有Monad类型的相应实例.声明可以采用以下形式:
a <- x
不好意思x >>= \a -> ...
x
x >>= \_ -> ...
如果这是最后一个陈述,那就是去掉或者只是x.- 一个让绑定
let a = x
.注意缺少in
关键字.例子
maybeSum desugars to …
是否可以在PureScript中强制显示(即创建字符串表示形式)任意记录以进行调试,而不管它是否具有类型类实例Show
?
我想显示Pux事件对象的内容,但它没有Show实例:
No type class instance was found for
Data.Show.Show { target :: { value :: String
, checked :: Boolean
}
, currentTarget :: { value :: String
, checked :: Boolean
}
, altKey :: Boolean
, button :: Number
, buttons :: Number
, clientX :: Number
, clientY :: Number
, ctrlKey :: Boolean
, metaKey :: Boolean
, pageX :: Number
, pageY :: Number
, screenX :: Number
, screenY …
Run Code Online (Sandbox Code Playgroud) 来自F#世界,我习惯使用|>
管道数据到函数:
[1..10] |> List.filter (fun n -> n % 2 = 0) |> List.map (fun n -> n * n);
Run Code Online (Sandbox Code Playgroud)
我假设受Haskell启发的PureScript有类似的东西.
如何在PureScript中使用管道运算符?
我有一个shuffle
功能Array
:
shuffle:: forall e. Array -> Eff (random :: RANDOM | e) Array
Run Code Online (Sandbox Code Playgroud)
它将 monad 中的数组打乱Control.Monad.Eff.Random
并返回包装后的数组。我想测试数组是否被打乱,想比较结果是否不同,所以我编写了 QuickCheck 代码,如下所示:
quickCheck \arr -> isShuffled (shuffle arr)
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何编写isShuffled
以匹配类型定义。自从:
没有像fromJust
in那样的解包函数Maybe
,因此它必须接受Random Array
并返回Random Boolean
,而我将检查代码放在 Monadic 表达式中。
因此,结果isShuffled
不会很简单Boolean
,而是像m Boolean
forTestable
中没有合适的,所以我可能需要为其创建一个实例,而 QuickCheck 中的注释提到:purescript-quickcheck
m Boolean
A testable property is a function of zero or more Arbitrary arguments, returning a Boolean or Result.
(代码 …
TL; DR我想为已编译的PureScript模块创建TypeScript类型,并将其分布在我的npm包中。我很乐于手动维护这些类型,只是无法弄清楚需要在tsconfig.json(上下)和package.json中放入什么。
我有一个项目,其中的核心功能是使用TypeScript CLI在PureScript中实现的,所有这些最终都通过npm以JavaScript的形式分发。我用一个简单的布局创建了一个类似的项目:
.
??? cli # TypeScript CLI project
? ??? main.ts
? ??? tsconfig.json
?
??? output # Compiled PureScript modules
? ??? People
? ??? externs.json
? ??? index.js
?
??? src # PureScript source
? ??? People.purs
?
??? types # TypeScript types for PureScript modules
??? People.d.ts
Run Code Online (Sandbox Code Playgroud)
在src/People.purs
我定义的核心功能:
module People where
type Person = { name :: String }
david :: Person
david = { name: "David …
Run Code Online (Sandbox Code Playgroud) 我不明白为什么下面的程序无法编译。
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (log)
import Data.Generic.Rep (class Generic)
import Foreign.Generic (defaultOptions, genericEncodeJSON)
main :: Effect Unit
main = do
log "Hello sailor!"
newtype Foo = Foo {
x :: Int
, y :: Int
, z :: Array Bar
}
type Bar = {
a :: String
, b :: String
}
derive instance repGenericFoo:: Generic Foo _
fooToJSON :: Foo -> String
fooToJSON = genericEncodeJSON $ defaultOptions { unwrapSingleConstructors = true …
Run Code Online (Sandbox Code Playgroud)