2017-07-19 56 views
2

我試圖用FFI導入下面的JavaScript函數到PureScript映射0參數的JavaScript函數:如何PureScript FFI

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

+1

「我希望getGreeting保留一個函數,而不是將其轉換爲常量」我認爲這個函數是一個常量。爲什麼你想要有這樣的功能? – paluh

+0

如果您正在使用某種副作用,或者您依靠某種外部狀態來生成或獲取此值,我認爲您可以將此函數類型設置爲getGreeting :: forall eff。 Eff(SOME_EFFECT | eff)字符串。 – paluh

+0

@paluh我不想更改'getGreeting',因爲它不是我的源代碼,現在應該被認爲是不可更改的。另外也沒有副作用,所以'Eff'類型是不可取的。 –

回答

2

Unit -> String是一個非常好的類型,或者可能是forall a. a -> String。後一種類型可能看起來過於寬容,但我們肯定知道a由於參數性而未被使用,所以該函數仍然必須是恆定的。

1

實在是有用的包purescript-functions這可能是在這種情況下有益的,如果你真的必須從Purescript調用此函數,它是(因爲我認爲它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 ;-)"; 
}; 
+0

謝謝paluh。很高興知道'Data.Function.Uncurried'。我決定從gb中得到答案,因爲對於那麼簡單的東西,給出'Unit - > String'類型似乎是最簡單的解決方案。 –

+0

酷! 'Data.Function.Uncurried'可以特別有用,當你在javascript方面有函數WITH(多個)參數並且不想包裝它們來寫入FFI綁定時;-) – paluh