gpt4 book ai didi

mocha.js - PureScript FFI 转 mocha

转载 作者:行者123 更新时间:2023-12-04 00:56:13 28 4
gpt4 key购买 nike

我正在尝试将 mocha 绑定(bind)写入 PureScript 并且对 Control.Monad.Eff 完全感到困惑

describe(function(){
//do stuff
});

Describe 是一个不接受任何内容并返回 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

显然在这里遗漏了一些东西。请帮忙。

最佳答案

PureScript 的外部函数接口(interface)其实很简单。例如,假设您有以下 JavaScript 函数:

function si(p) {
return function (r) {
return function (t) {
return p * r * t / 100;
};
};
}

您可以按如下方式导入它:
foreign import si :: Number -> Number -> Number -> Number

您还可以按如下方式内联该函数:
foreign import si
"function si(p) {\
\ return function (r) {\
\ return function (t) {\
\ return p * r * t / 100;\
\ };\
\ };\
\}" :: Number -> Number -> Number -> Number

对于副作用 PureScript 不使用 IO单子(monad)。相反,它使用 Eff单子(monad)。

据我了解 Eff monad 与 IO 相同带有额外类型参数的 monad:一行效果。

例如,在 Haskell 中, print函数具有以下类型:
print :: Show a => a -> IO ()

在 PureScript 中, print函数具有以下类型:
print :: Show a => a -> Eff (trace :: Trace | r) Unit

那么我们从中了解什么呢?
  • IO类似于 Eff e在哪里 e是一排效果。
  • Unit类似于 () .
  • print函数有 trace类型为 Trace 的效果.
  • 此外,print功能可以与其他效果相结合。行多态性。这意味着它是可组合的。

  • 一个 Eff值本身称为 Action 。例如 print "Hello World!"类型为 Eff (trace :: Trace | r) Unit是一个 Action 。

    一个 Eff作为函数参数的值称为处理程序。它可以被认为是一个没有参数的高阶有效函数。

    一个 Eff没有副作用的值称为纯值:
    type Pure a = forall e. Eff e a
    runPure :: Pure a -> a

    由于效果行(即 e)是多态的(或者换句话说是空的,一个黑洞),PureScript 假设该函数没有副作用。然而,这也意味着它可以与其他有效的功能组合。
    Eff monad 是程序员和编译器之间的契约,其中程序员向编译器 promise 给定的 Eff value 将仅具有规定的效果行,仅此而已。

    来到您的 describe功能:

    Describe is a function that takes nothing and returns IO, or Eff or something that means (side-effect happened no value returned).



    其实这是错误的。您的 describe function 确实将函数作为参数:
    describe(function(){
    //do stuff
    });

    此外,它接受的函数没有参数,这意味着它是一个有效的函数。因此它必须是 Eff e a 类型。在哪里 ea可以分别是任意一行效果和任意返回值。

    因此,您的描述函数必须是以下类型:
    describe :: Eff e a -> Eff (describe :: Describe | e) {}

    在 Haskell 中,它会这样写:
    describe :: IO a -> IO ()

    PureScript 比 Haskell 更明确。无论如何, Describe是您创建的一种新效果类型,它区别于其他效果类型,例如 Trace :
    foreign import data Describe :: !

    然后您将导入 describe如下:
    foreign import describe
    "function describe(f) {\
    \ return function () {\
    \ window.describe(f);\
    \ };\
    \}" :: forall e a. Eff e a -> Eff (describe :: Describe | e) {}

    最后,您可以按如下方式使用它:
    main = do
    describe $ print "Hello World!"

    整个代码如下:
    module Main where

    import Control.Monad.Eff
    import Debug.Trace

    foreign import data Describe :: !

    foreign import describe
    "function describe(f) {\
    \ return function () {\
    \ window.describe(f);\
    \ };\
    \}" :: forall e a. Eff e a -> Eff (describe :: Describe | e) {}

    main = do
    describe $ print "Hello World!"

    它将生成以下 JavaScript:
    var PS = PS || {};

    PS.Main = (function () {
    "use strict";

    var Prelude = PS.Prelude;
    var Debug_Trace = PS.Debug_Trace;

    function describe(f) {
    return function () {
    window.describe(f);
    };
    }

    var print = Debug_Trace.print(Prelude.showString({}));

    var main = describe(print("Hello World!"));

    return {
    main: main,
    describe: describe
    };
    }());

    希望有帮助。

    关于mocha.js - PureScript FFI 转 mocha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728624/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com