如何在PureScript FFI

时间:2017-07-19 07:56:30

标签: ffi purescript

我正在尝试使用FFI将以下JavaScript函数导入PureScript:

function getGreeting() {
  return "Hi, welcome to the show."
}

但我不确定应该是什么类型。我最接近的是:

foreign import getGreeting :: Unit -> String

我确实希望getGreeting保留一个函数,而不是将其转换为常量。

有没有更好的方法来写这种类型?如果我在PureScript中使用这种签名定义一个虚函数,我试着看看PureScript做了什么:

var getGreeting = function (v) {
  return "Hi, welcome to the show.";
};

有没有办法摆脱那些未被使用的v参数?

TIA

2 个答案:

答案 0 :(得分:2)

有一个非常有用的包purescript-functions可以在这种情况下提供帮助,如果你真的需要从Pu​​rescript中调用这个函数(因为我认为它IS只是一个常量你可以尝试:

module Main where

import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Data.Function.Uncurried (Fn0, runFn0)

foreign import getString ∷ Fn0 String

main :: forall e. Eff (console :: CONSOLE | e) Unit
main = do
  log (runFn0 getString)

我已经创建了这个简单的javascript模块,因此可以测试此示例:

/* global exports */
"use strict";

// module Main

exports.getString = function() {
  return "my constant string ;-)";
};

答案 1 :(得分:2)

Unit -> String是一个非常好的类型,或者forall a. a -> String。后一种类型似乎过于宽松,但我们确信a由于参数化而未被使用,因此函数仍然必须是常量。