2016-09-20 5 views
-5

JSでFPを使って遊ぶ。
は、私は2つの機能JSの機能プログラミング

getLine ::() -> IO String 
cat :: String -> Task Error String 

があるとし、この二つの機能を構成する適切な方法は何ですか?

UPD: 私は

const main =() => compose(map(cat), getLine).performIO().fork(logError, printResult) 

を除く他のソリューションを参照することはできませんが、私は、これはそれを行うための適切な方法であることはよく分かりません。

+1

ようこそ。何をどのように尋ねるかを確認するには、[ヘルプ]をご覧ください。私は人々が[mcve]のように期待される結果についてもっと説明したいと思うと思います。 – mplungjan

+2

まず最初に試してみる必要があります。問題が発生した場合は、試したこととエラーが得ている。しかし、質問を投稿する前に基本的な調査を行うことも同様に重要です。 – ishmaelMakitla

+0

'const main =()=> compose(map(cat)、getLine).performIO()。fork(logError、printResult)'以外の解決策は見当たりませんが、それを行う方法。 – Nick

答えて

0

私はあなたがHaskellのイディオムを使用しているので、あなたがHaskellをよく知っていると仮定しています。あなたは、次の機能があります。

getLine ::() -> IO String -- why isn't this simply `getLine :: IO String`? 
cat :: String -> Task Error String 

あなたがしたいまず最初に、IOアクションをラップ余計な機能を取り除くされています

getLine() :: IO String 

その後、あなたはcatgetLine()を構成するfmapを使用することができます:

fmap cat getLine() :: IO (Task Error String) 

最後に、Taskを想定するEither及びに類似していますがeitherに似ている、我々は行うことができます。

fmap cat getLine() >>= fork logError printResult :: IO String 

これは以下のようにJavaScriptで書くことができます。今すぐ

getLine() 
    .map(cat) 
    .bind(fork(logError, printResult)); 

、あなたがIOアクションのための適切なmapbindメソッドを実装するだけですJavaScriptで。


編集:

(>>= fork logError printResult) . fmap cat . getLine ::() -> IO String 

JavaScriptではこれはに変換します::は、あなたは、単にHaskellで次の操作を行うことができ、それらを構成する

compose(bind(fork(logError, printResult)) 
     , fmap(cat) 
     , getLine 
     ); 

これは想定してのfmapbindこと

と定義されます。
function fmap(f) { 
    return function (x) { 
     return x.map(f); 
    }; 
} 

function bind(f) { 
    return function (x) { 
     return x.bind(f); 
    }; 
} 

したがって、引き続きIOアクションのためにmapbindメソッドを実装する必要があります。

+0

私は同じ解決策を得ました(UPDを参照)が、ポイントフリーです。 unsafePerformIOは非常に悪い習慣とは考えられていませんか? – Nick

+0

あなたの 'performIO'関数が実際にやっていることではありませんか?安全でない方法でIOアクションを実行しています。別の方法として、 'fork'演算をIOモナドに持たせる方法があります。あなたはモナドのバインド演算子(すなわち、['>> ='](http://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#v:-62--62)を使ってこれを行うことができます - 61-))。 –

+0

'Task'は実際にはHaskellのControl.Monad.Taskのようなものですが、エラー処理があります。何かhttps://www.npmjs.com/package/data.taskのようなものです 私が理解するように、私は 'どちらか 'のようなものを実装する必要がありますが、' fork'メソッドのために。 – Nick