2016-05-19 10 views
2

私はHaskellのd3jsライブラリを読んでされています:Haskellでは `>>>`と `>> =`はどのように動作しますか?

これはHaskellのボックスを定義するコードです:

box :: Selector -> (Double,Double) -> St (Var' Selection) 
box parent (w,h) = do 
    assign 
     $ ((d3Root 
      >>> select parent 
      >>> func "append" [PText "svg"] 
      >>> width w 
      >>> height h 
      >>> style "background" "#eef") :: Chain() Selection) 

コードが実際にd3.jsコードでbox機能を使用してエクスポートすると、このよう>>=演算子を使用しています:

import Control.Monad 
import qualified Data.Text as T 
import D3JS 

test :: Int -> IO() 
test n = T.writeFile "generated.js" $ reify (box "#div1" (300,300) >>= bars n 300 (Data1D [100,20,80,60,120])) 

この不評のようにされるのを避けるために、矢印の質問:How to use arrow operators in haskell タイプシグネチャやその他の基本情報はどこにありますか? 私が多くを学ぶことができるリソースがある:これはarrow可能性がありますが、私はそれをインポートしたところ、私は表示されません

最初のものを見つけるのは簡単だったが、答えは混乱した:

*Main Lib> :t ($) 
($) :: (a -> b) -> a -> b 

私はf $ a b c = f ((a b) c)

f a b c = (((f a) b) cしばらくプレリュードが >>=含むモナドのための同様の応答を与えることがわかりました。私の場合、IOモナドかもしれない。それは危険で

*Main Lib> :t (>>>) 

<interactive>:1:1: 
    Not in scope: ‘>>>’ 
    Perhaps you meant one of these: 
     ‘>>’ (imported from Prelude), ‘>>=’ (imported from Prelude) 

最後にきれい不可欠になりますので、またはd3js文はモナドSt()

*Main Lib> :t (>>=) 
(>>=) :: Monad m => m a -> (a -> m b) -> m b 

最後のものは残念である...まったく表示されませんすぐにあまりにも多くの質問を束ねる。誰かがこのタイプの署名を説明できますか?特に最後の項目: - ここにインポートされた作品は、Control.Categoryからである - そしてそれは射の左から右への構図を示し@deltaとして

box :: Selector -> (Double,Double) -> St (Var' Selection) 
+4

https://www.haskell.org/hoogle/ – delta

+1

'>>>'は実際に 'Control.Category'で定義されています。 ( 'Category'は' Arrow'のスーパークラスです。) – chepner

+0

あなたの最後の質問について - 私は、あなたがそれについて何を理解しているのか、そして何を問題にしているのかという質問に答えるようお願いします。あなたはそれぞれのタイプの定義を見ましたか? – epsilonhalbe

答えて

3

パッケージインデックス

パッケージは、通常はすべての機能/種類/などのインデックス・ページが定義されています。 d3jsパッケージのインデックスは次の場所にあります。

  1. 任意のモジュール名にパッケージの
  2. クリックしてフロントページをご覧ください:

    を次の方法でそこに着くことができますエクスポートされたモジュールツリーリスト

  3. 右上隅には、Source | Contents | Index | Styleのリンクがあります。 [索引]リンクをクリックします。

Stとは何ですか?

St

type St r = RWS() Text Int r 

RWSとして定義されているリーダー、ライターと国家の能力を持っているだけでモナドです。 Reader環境は()で、Textの値とIntの状態を書き込みます。

それは(mtlパッケージから入手可能)の便利な定義ですので、あなたはReaderTWriterTStateTを使用して独自のモナド変圧器スタックを構築する必要はありません。

リーダ環境が()であることに注意してください。つまり、ライブラリはモナドのライタと状態の側面のみを実際に使用しています。

box ... >= box ...はどのように機能しますか?それはSelectとダブルスのペアを取り、StモナドでVar' Selectorを返す手段

box :: Selector -> (Double, Double) -> St (Var' Selection) 

box機能は、タイプを有しています。

do vs <- box "#div1" (300,300) 
    bars n 300 (Data1D [...]) vs 

解釈::

  1. Var' Selectionを作成するbox機能を実行します

    表現box "#div1" (300,300) >>= bars n 300 (Data1D [...])は同じです。これはStモナドで発生します。ステップによって返さVar' Selection 1.

  • コールbarsVar' SelectionSelectionの違いは何ですか?正直、私はよくわからない。

    >>>オペレータ

    >>>矢印演算子です。矢印は、操作のパイプラインとして計算を表現する方法です。このページの例はあなたにそれが使われている方法のアイデアを与える必要があります。

    https://www.haskell.org/arrows/syntax.html

    注意を>>>が型クラスの用語で定義されたので、それがない、まさにあなたがそれを使用しているタイプに依存していることと。この場合、値はChain() Selectionで使用されています。

    あなたがChain(link)のためのドキュメントを読んでいる場合は、コメント表示されます:bはちょうど( - > b)のように振る舞う

    チェーンを。 Val Varはチェーンの始点(=定数)であり、Nilはチェーンの終点です。

    ので、このフラグメント:D3オブジェクトに

    1. スタート:

                -- type: 
      d3Root >>> select parent     -- Chain() Selection 
           >>> func "append" [PText "svg"]  -- Chain a b 
           >>> width w       -- Chain a a 
           >>> height h       -- Chain a a 
           >>> style ...      -- Chain a a 
      

      は次のように読み取ることができます。これは選択を返します。

    2. その選択肢の親を選択します。
    3. 引数その後、幅、高さを設定し"svg"
    4. でJS機能appendを呼び出した後、興味深いのは何なスタイル

    func機能がChain a b型を持つことである - それは無制限の戻り値の型bを持っています。そのため、最後に明示的なタイプシグネチャがあると思われます。 :: Chain() Selection

  • 1

    はすでにhoogleはあなたの友人であると述べました。

    この場合、手元のカテゴリはモナドHaskのちょうどサブカテゴリーに関連する クライスリ圏である - そして >>>オペレータは

    f :: m a -> m b 
    g :: m b -> m c 
    
    のような関数を作成する 行方不明 リンクあり

    が正しく動作します。

    >>= :: m a -> (a -> m b) -> m b 
    

    はそれを行うことができないだろうが、

    >>> :: (m a -> m b) -> (m b -> m c) -> ma -> m c 
    

    (>>>)の特殊なバージョンは、あなたh = (f >>> g)に正しい出力を与えるだろう。 Hackage上

    +1

    私は 'm a - > m b' Kleisliとは呼ばないでしょう。 ** Hask **のサブカテゴリです。 'a - > m b'はKleisliになります。実際に '' = ''(もっと正確に言うと、 '> =>')は単純な関数形式でKleisliの矢を構成しますが、 '' >> 'はそれらをラップされた形式でしか作れません。(http://hackage.haskell。 org/package/base-4.8.2.0/docs/Control-Arrow.html#t:Kleisli)。 – leftaroundabout

    +0

    オハイオ州 - それは私の部分で長い間誤解されていた - 私に言ってくれてありがとう – epsilonhalbe

    関連する問題