Fre*_*all 12 ffi mocha.js purescript
我试图将mocha绑定写入PureScript,我完全不知所措 Control.Monad.Eff
describe(function(){
  //do stuff  
});
描述是一个不带任何东西并返回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
显然遗漏了一些东西.请帮忙.
Aad*_*hah 14
PureScript的外部函数接口实际上非常简单.例如,假设您具有以下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不使用IOmonad.相反,它使用Effmonad.
根据我的理解,Effmonad 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由本身的价值被称为动作.例如print "Hello World!",类型Eff (trace :: Trace | r) Unit是动作.
作为Eff函数参数的值称为处理程序.它可以被认为是一个没有参数的高阶有效函数.
一个Eff与没有副作用值被称为纯值:
type Pure a = forall e. Eff e a
runPure :: Pure a -> a
由于效果行(即e)是多态的(或者换句话说是空的,黑洞),PureScript假定该函数没有副作用.然而,这也意味着它可以与其他有效的功能组合.
该Eff单子是程序员,在程序员承诺编译器给定的编译器之间的合同Eff价值将只影响既定的行并没有更多的.
来你的describe功能:
描述是一个不带任何东西并返回IO,或Eff或其他东西的函数(副作用没有返回值).
其实这是错的.您的describe函数确实将函数作为参数:
describe(function(){
  //do stuff
});
此外,它所采用的函数没有参数,这意味着它是一个有效的函数.因此,它必须是Eff e a其中的类型,e并且a可以分别是任何效果行和任何返回值.
因此,您的describe函数必须是以下类型:
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
    };
}());
希望有所帮助.
| 归档时间: | 
 | 
| 查看次数: | 777 次 | 
| 最近记录: |