我想知道如何在 PureScript 代码中进行注释。
在 Python 中,等价的是:
# Here is a comment
Run Code Online (Sandbox Code Playgroud)
或者 JavaScript
// Another comment
Run Code Online (Sandbox Code Playgroud)
PureScript 中的等效项是什么?
以下是一个最小的、人为的示例:
read :: FilePath -> Aff String
read f = do
log ("File: " <> f) -- (1)
readTextFile UTF8 f -- (2)
Run Code Online (Sandbox Code Playgroud)
我想在发生(1)潜在错误之前进行一些调试日志记录(2)。到目前为止,在 Spago REPL 中执行以下代码适用于成功案例:
$ spago repl
> launchAff_ $ read "test/data/tree/root.txt"
File: test/data/tree/root.txt
unit
Run Code Online (Sandbox Code Playgroud)
(2)问题:如果- file is directory here -出现错误,(1)则似乎根本没有执行:
$ spago repl
> launchAff_ $ read "test/data/tree"
~/purescript-book/exercises/chapter9/.psci_modules/node_modules/Effect.Aff/foreign.js:532
throw util.fromLeft(step);
^
[Error: EISDIR: illegal operation on a directory, read] {
errno: -21,
code: 'EISDIR',
syscall: 'read'
} …Run Code Online (Sandbox Code Playgroud) debugging logging functional-programming purescript visual-studio-code
我有两个我认为等效的类型类和实例定义的实现。PureScript 版本构建时没有错误,但 Haskell 版本失败并出现错误Un-determined variables: e, f。
我可以在 Haskell 中完成这个工作吗?
哈斯克尔:
class Foo a b c | a b -> c where
newtype Bar a b = Bar (a, b)
instance (Foo a c e, Foo b d f) => Foo (Bar a b) (Bar c d) (Bar e f) where
Run Code Online (Sandbox Code Playgroud)
纯脚本:
class Foo a b c | a b -> c
newtype Bar a b = Bar (Tuple a b)
instance (Foo a c e, Foo b …Run Code Online (Sandbox Code Playgroud) PureScript中Sproxy有什么用?
在追求中,它被写成
data SProxy (sym :: Symbol)
--| A value-level proxy for a type-level symbol.
Run Code Online (Sandbox Code Playgroud)
purescipt 中的 Symbol 是什么意思?
在我自定义的Halogen/Purescript项目中,我遵循AJAX示例中的模式,在这里我将我的行为分解为纯粹Input的和有效Request的.
我想更改我的事件处理程序以使用该preventDefault行为,但不明白这会对UI函数的类型产生什么影响.
我通过以下方式更改事件处理程序,对AJAX示例进行了相同的更改:
之前:
H.button [ A.classes [B.btn, B.btnPrimary]
, A.disabled busy
, A.onclick (\_ -> pure (handler code))
] [ H.text "Compile" ]
Run Code Online (Sandbox Code Playgroud)
后:
H.a [ A.classes [B.btn, B.btnPrimary]
, A.href "#compile"
, A.disabled busy
, A.onclick (\_ -> E.preventDefault $> pure (handler code))
] [ H.text "Compile" ]
Run Code Online (Sandbox Code Playgroud)
(完全差异在这里可用)
我最终得到这种类型的错误:
Cannot unify type
Example.Ajax.Input
with type
Halogen.HTML.Events.Monad.Event Halogen.HalogenEffects<(http ::
Example.Ajax.HTTP | u32519)> Example.Ajax.Input
Run Code Online (Sandbox Code Playgroud)
此时,我有点迷失是否需要调整UI函数的类型签名或者我preventDefault以错误的方式应用修饰符.
在使用PureScript教程时,代码示例开始使用"=>"而不引入它.结果我不明白何时使用'=>'而不是' - >'.
例如,这使用'=>':
instance showArray :: (Show a) => Show (Array a) where
show array = "[" <> map show array <> "]"
Run Code Online (Sandbox Code Playgroud)
这里使用' - >':
greet :: forall r. { name :: String | r} -> String
greet namedThing = "Hello, " ++ namedThing.name
Run Code Online (Sandbox Code Playgroud) 我正在使用PureScript中的以下代数数据类型...
data Extended a = Infinite | Finite a
v1 = Finite 11
v2 = Infinite
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何模式匹配"无限"情况,因为它似乎v2有类型forall t140. Extended t140.我假设t140是编译器自动填充的某种占位符.v1的类型是Extended Int.因此,如果我设置一个Eq实例来比较Extended的值,那么Infinite案例就不匹配......
instance extendedEq :: (Eq a) => Eq (Extended a) where
eq (Finite a) (Finite b) = eq a b
eq Infinite Infinite = true
eq Infinite _ = false
eq _ Infinite = false
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试运行时,v2 == v2我得到错误...
No type class instance was found for Prelude.Eq (Extended _0)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为我想它正试图为t140找到一个Eq实例.
所以我的问题是,如何在无限类型上进行模式匹配?
我正在尝试使用purescript-thermite来构建一个使用websockets的应用程序.这个想法是应用程序使用websockets连接到某个服务器并实时更新HTML页面.但是,我找不到如何将其连接到thermite工作流程的方法.
我有一个spec由render和组成的performAction.在render访问的dispatch功能.但是,我需要在渲染元素之前启动websockets(我可能会把它放到例如main),但是在消息到达时,我需要理想地dispatch从外部向组件发送事件.最好的方法是什么?
我花了大约一个小时的时间学习PureScript,并且我通过PureScript在他们的网站上推荐的示例教程中遇到了一些障碍.(具体来说,我在第2.10节).我设法安装了所有东西,我试图使用logShow他们在教程中描述的方法.我得到的Unknown value logShow,当我运行此代码错误:
module Main where
import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Math (sqrt)
main :: forall e. Eff (console :: CONSOLE | e) Unit
main = logShow (diagonal 3.0 4.0)
diagonal w h = sqrt(w * w + h * h)
Run Code Online (Sandbox Code Playgroud)
我假设这logShow是一个用于记录整数的log方法,因为实际方法只接受字符串.这个方法定义在哪里?我没有输入什么东西吗?我的安装不正确吗?或者教程是否正在跳过某些内容?
提前致谢!
我最近正在学习PureScript,并做了一个小应用程序,可以在屏幕上绘制一个立方体。一切都很好,我newtype在Main模块顶部定义了一些,如下所示:
newtype Vec2 = Vec2
{
x :: Number
, y :: Number
}
newtype Vec3 = Vec3
{
x :: Number
, y :: Number
, z :: Number
}
Run Code Online (Sandbox Code Playgroud)
我还获得了一些进行转换等功能的功能,perspectiveDivide我想移至另一个模块Transforms以更好地组织。因此,我将这些类型移到了“转换”模块中,并导出了它们。
module Transforms (Vec2, Vec3, perspectiveDivide) where
Run Code Online (Sandbox Code Playgroud)
并且上述类型遵循此。
现在,我尝试使用选择性导入功能将它们导入到主模块中,但是没有用。
import Transforms (Vec2, Vec3, perspectiveDivide)
Run Code Online (Sandbox Code Playgroud)
但是在尝试使用projectToScreen仍在主模块中的函数时,仍然给我一个错误。错误是这样的:
在src / Main.purs模块Main中的第30行第10列-第30行第18列中
Run Code Online (Sandbox Code Playgroud)Unknown data constructor Vec3请参阅 https://github.com/purescript/documentation/blob/master/errors/UnknownName.md 了解更多信息,或提供与此错误相关的内容。
我既是函数式编程的新手,也是PureScript的新手。这个错误是什么意思?