我正在将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类型类时遇到了麻烦.我必须在前面说,我不是Haskell专家,所以如果这些是明显的错误我会道歉.
我已经尝试了几种不同的方法,并为每个方法打了一堵墙.我基本上试图为show图中的边定义函数.一种方法如下:
module Foo where
data Edge n = Edge { from :: n, to :: n }
instance showEdge :: (Show n) => Show (Edge n) where
show e = "Edge from "++(show e.from)++" to "++(show e.to)
e = Edge { from: 1, to: 2 }
main = show e
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
$ psc src/Attempt1.purs
Error at src/Attempt1.purs line 6, column 27:
Error in declaration showEdge
Cannot unify Prim.Object with Foo.Edge.
Run Code Online (Sandbox Code Playgroud)
我猜这与它推断e出定义中的类型这一事实有关show.我在这里尝试添加类型注释,但是我收到了语法错误:
module Foo …Run Code Online (Sandbox Code Playgroud) 我有以下简单的代码
import Data.String.Regex
import Data.Array
last <$> match someRegex " 1"
Run Code Online (Sandbox Code Playgroud)
哪里
match someRegex " 1"
Run Code Online (Sandbox Code Playgroud)
返回类似的东西
Just ([Just (" 1"),Just (" "),Just ("1")])
Run Code Online (Sandbox Code Playgroud)
和
last <$> match someRegex " 1"
Run Code Online (Sandbox Code Playgroud)
返回类似的东西
Just (Just (Just (" 1")))
Run Code Online (Sandbox Code Playgroud)
现在我有一个深深嵌套的Maybe.这使得它很难处理(甚至使用仿函数).我给自己写了一对辅助函数 - 但我对此并不满意.它不知何故感觉不对.
extract j = do
case j of
Nothing -> Nothing
Just a -> a
extract2 jj = extract $ extract jj
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
extract2 $ last <$> match someRegex " 1"
Run Code Online (Sandbox Code Playgroud)
在Purescript/Haskell中有没有更好/惯用的方法来做这些事情?
我想用Purescript的Halogen编写我的前端的特定组件.
例如,我想使用Halogen创建一个注册表.它看起来如下所示:
module RegistrationForm where
import Prelude
...
-- | The state of the application
newtype State = State { email :: String, password :: String }
derive instance genericState :: Generic State
instance showState :: Show State where show = gShow
instance eqState :: Eq State where eq = gEq
initialState :: State
initialState = State { email: "", password: "" }
-- | Inputs to the state machine
data Input a = FormSubmit a
| UpdateEmail String a …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Record转换为vanilla JS对象
module MyModule where
data Author = Author { name :: String, interests :: Array String }
phil :: Author
phil = Author { name: "Phil", interests: ["Functional Programming", "JavaScript"] }
Run Code Online (Sandbox Code Playgroud)
当我从JS访问对象时
MyModule.phil
Run Code Online (Sandbox Code Playgroud)
它包含我不感兴趣的其他属性(value0)
{"value0":{"name":"Phil","interests":["Functional Programming","JavaScript"]}}
Run Code Online (Sandbox Code Playgroud)
你如何将Purescript世界的记录编组到JS?
是否可以在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) 我是函数式编程的新手,我决定在Purescript中构建一个应用程序.我遇到了第一个障碍,我不确定如何从概念上思考这个问题.
我不是在寻找代码,而是在功能上思考这个问题.
我有一个数据列表.具体来说,就像
[ {a :: String, b :: String, c :: String} ]
Run Code Online (Sandbox Code Playgroud)
我想通过使用提供的记录(以及上面类型的列表)创建Html(这是一种purescript-halogen类型)的列表.
所以,我会有一个功能
buildElements :: forall p i. MyRecordObject -> Array (HTML p i)
Run Code Online (Sandbox Code Playgroud)
现在,我想我需要给这个函数结果类型一个Monad计算上下文(purescript Eff就像Haskell IO)
所以类似于:
buildElements :: forall p i. MyRecordObject -> Eff (Array (HTML p i))
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是模糊地创建一个类似的列表
take $ length xs $ repeat ARecordObject
Run Code Online (Sandbox Code Playgroud)
然后将记录映射到该列表,但我不确定如何将其转换为代码.无论如何,这似乎是错误的,因为我的计划涉及改变状态ARecordObject,这是一个禁忌.
那么我发现了这个功能:
forEach :: forall e a. Array a -> (a -> Eff e Unit) -> Eff Unit
Run Code Online (Sandbox Code Playgroud)
看起来几乎完美!我得到一个数组,我给它一个函数,以某种方式将记录中的属性分配给这个新数组......但不,等等......我正在考虑非功能性.
我真的在这里有点亏.基本上,我想创建类似于<li></li> …
这在我看来,一个奇怪的问题,但我已经通过了purescript-datetime,并purescript-js-date和我不能找到一个办法让电流DateTime.是否有一些隐藏的库函数或者我必须通过FFI?
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) Conal Elliott在这里谈论Streams和Comonads:http://conal.net/blog/posts/sequences-streams-and-segments
但是,他没有直接提到行为.所以......是行为的共同体,如果是这样的话 - 这实际意味着什么呢?
对于初学者 - 我认为行为可以提供extend和extract功能.我看到它工作的唯一方法是它是否在特定时刻对值进行采样.
这是Comonad对行为意味着什么?它允许一个人"分叉并冻结"一个行为?
换句话说 - 如果我们有一个行为随着时间的推移具有这些值:A,B,C,D,...我们可以extend在它的时间B,并获得一个B无限期包含的新行为(这是有用的 - 因为我们可以当时lift或map它等)
purescript ×10
haskell ×3
debugging ×1
frp ×1
functor ×1
halogen ×1
inspect ×1
javascript ×1
node.js ×1
npm ×1
typescript ×1