繁体   English   中英

Haskell调用Node.js文件不起作用

[英]Haskell call Node.js file not working

我试图在Haskell中编写一个程序,将输入作为句子字符串,使用该输入调用javascript文件,然后将该javascript文件的输出作为Haskell文件的输出返回。 目前,javascript文件的输出未打印。 尚不清楚是否调用了javascript文件。

这是Haskell中的脚本:

main :: IO ()
main = 
    do 
        putStrLn "Give me the paragraphs \n"
        paragraphs <- getLine
        output <- readCreateProcess (shell "node try2.js") paragraphs
        putStrLn output

Node.js中的脚本。 所需的输出是概要:

var lexrank = require('./lexrank');
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Hi', (answer) => {

  var originalText = answer;

  var topLines = lexrank.summarize(originalText, 5, function (err, toplines, text) {
      if (err) {
        console.log(err);
      }

      rl.write(toplines);
      // console.log(toplines);

      });

  rl.close();
});

我猜我的stdin方式有问题。 我是Node.js的新手

我花了很长时间,但是以下代码有效:

Haskell文件:

import System.Process

main :: IO ()
main = 
    do 
        putStrLn "Give me the paragraphs \n"
        paragraphs <- getLine
        output <- readCreateProcess (shell "node lexrankReceiver.js") (paragraphs ++ "\n")
        putStrLn output

NodeJs文件:

// Getting this to work took almost a full day. Javascript gets really freaky
// when using it on terminal. 


/* Import necessary modules. */ 
var lexrank = require('./Lexrank/lexrank.js');
const readline = require('readline');
// var Type = require('type-of-is');
// var utf8 = require('utf8');


// Create readline interface, which needs to be closed in the end.
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// Set stdin and stdout to be encoded in utf8. Haskell passes string as basic 
// 8-bit unsigned integer array. The output also needs to be encoded so that 
// Haskell can read them
process.stdin.setEncoding('utf8');
process.stdout.setEncoding('utf8');

// If a string is readable, start reading. 
process.stdin.on('readable', () => {
  var chunk = process.stdin.read();

  if (chunk !== null) {

    var originalText = chunk;

    var topLines = lexrank.summarize(originalText, 5, function (err, toplines, text) {
      if (err) {
        console.log(err);
      }

      // Loop through the result to form a new paragraph consisted of most 
      // important sentences in ascending order. Had to split the 0 index and
      // the rest indices otherwise the first thing in newParagraphs will be
      // undefined. 
      var newParagraphs = (toplines[0])['text'];

      for (var i = 1; i < toplines.length; i++) {
        newParagraphs += (toplines[i])['text'];
      }

      console.log(newParagraphs);

    });
  }
});

// After the output is finished, set end of file. 
// TODO: write a handler for end of writing output.
process.stdin.on('end', () => {
  process.stdout.write('\n');
});

// It is incredibly important to close readline. Otherwise, input doesn't 
// get sent out. 
rl.close();

Haskell程序的问题在于,段落不是一行输入,而只是一个字符串,因此要解决该问题,您可以追加一个换行符,例如:

output <- readCreateProcess (shell "node try2.js") $ paragraphs ++ "\n"

为了找到这个问题,我尝试用垫片代替question

rl.question = function(prompt, cb) {
  rl.on('line', function(thing) {
    console.log(prompt);
    cb(thing);
  })
}

那行得通,所以我知道这与question如何处理stdin有关。 因此,在此之后,我尝试添加一个换行符,并且该方法成功了。 这意味着question需要输入“行”,而不是任何字符串,这与on('line') ,这很奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM