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

标签 javascript node.js haskell stdout stdin

我正在尝试在 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();
});

我猜我的标准输入方式有问题。我是 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();

关于javascript - Haskell 调用 Node.js 文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902239/

相关文章:

javascript - 如何在webAPP中的firebase中添加新条目

javascript - chart.js:在饼图外显示标签

javascript - MongoDB $cmp(聚合)给出错误结果

javascript - 为什么我的异步函数返回 Promise { <pending> } 而不是一个值?

haskell - 使用 Haskell 处理联合按键

macos - Haskell gtk 安装类型冲突

javascript - 帖子上的日期选择器值不应失去其行为

javascript - 从 "append(<tr><td="ID 获取 ID">..."

node.js - 需要多次运行 npm update

haskell - cabal 更新: Local and remote files match