問題タブ [arrows]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - HXT の Arrow のカウントとフィルタリング
XML を解析しようとしていますが、特定のノードから決定された数の子のみをフィルタリングして抽出したいと考えています。例えば:
そして、矢印を実行するgetChildren >>> myFilter 2
と、ID が「a」と「b」のノードのみが返されます。
直感的には、追跡するにはステート アローを使用する必要がありますが、その方法がわかりません。
私はそれを自分でやろうとしましたが、それは私が望んでいるものとはまったく異なり、非常にエレガントに見えず、機能しません. 初期状態として整数パラメーターを使用して一連の矢印を実行し、runSLA
次を定義しようとします。
しかし、もちろん を返すことはできませんNothing
。XmlTree を返す必要があります。しかし、私は何も返したくありません!
そこにはおそらくもっと良い方法があります。手伝って頂けますか?
お時間をいただきありがとうございます。
haskell - Arrow演算子に関する簡単な質問
私が持っていると言うf :: u -> v -> w
とg :: x -> y -> z
。私が欲しいのはですh :: (u,x) -> (v,y) -> (w,z)
。
だから私はこれを手動で行うことができます:
しかし、その楽しみはどこにありますか?
Iを使用(***)
すると、途中まで到達できます。
しかし、私はその最後のマイルを取得する方法を理解することはできません。
haskell - Haskell rec キーワードはどのように機能しますか?
アロー do 記法では、rec キーワードを使用して再帰的な定義を記述できます。たとえば、次のようになります。
これはどのように評価できますか?無限ループか何かに陥りそうです。ループ矢印コンビネータに評価されることは知っていますが、それがどのように機能するかはわかりません。
編集:その力の例は本当に役に立ちます。しかし、それを do 表記でどのように記述しますか? recを使用する必要があると思います。
generics - Haskell でのジェネリック型変換
通常の関数を取り、それらを抽象値の計算に変換するアロートランスフォーマーを作成しようとしています。「ソース」矢印がある場合、
次に、この例では、リフトされた [sic?] 抽象値型でfを機能させることが目標になります。
ただし、この矢印をうまく実装するには、いくつかの型を持ち上げて、任意の深さでいくつかの具体的な値といくつかの抽象値を持つ異種データ構造を持つようにする必要があります。私がやったことは、通常のhaskellコンストラクターに特別なタイプを追加することです。
次に、タプル コンストラクターである (,) の抽象表現を追加します。
gのコードは[少し展開] に持ち上げられ、
同じことを AVEither で行う必要があります。これは多くのケースで終わるでしょう。これを回避する良い方法はありますか?
私は Haskell の初心者なので、参考文献または半詳細な説明を送ってください。おそらく私が読んだ中で最も近いのは、SYBR の論文 (ボイラープレートの革命を破棄する) のセクション 1 ~ 3 です。
本当にありがとう!
debugging - Haskell の無限再帰
この質問は本質的に GHCi を使用した Haskell プログラムでの無限ループのデバッグの複製です。他の解決策を知りたいのですが、著者は手動で解決しました。
(私の特定の問題)
再帰呼び出しを含む矢印コードがあります。
はerrorArrow
、再帰的な testAVFunctor を実行しないようにする必要があります。これにより、 isError が を返しLeft (AVError "good error")
、ルートを選択しpassError
て再帰呼び出しをバイパスする必要があります。
非常に奇妙なことは、関数合成のような一般的なサイトに「トレース」呼び出しを挿入すると、プログラムが有限量の出力を発行してからフリーズすることです。無限項展開問題から私が期待するものではありません。(編集1を参照)
誰かが興味を持っている場合は、ここにソースコードをアップロードしました。
編集1
私は正しい場所を探していませんでした (ソースを見たい場合は、明らかにavEitherがループしていたようです)。私がそこにたどり着いた方法は、バイナリをコンパイルして gdb を実行することでした:
- gdb メイン
- r (コードを実行)
- Ctrl+C (割り込み送信) . バックトレースは役に立たないだろうが、できることは当たっている
- s (ステップ) . 次に、Enter キーを押したままにします。多くのメソッド名が飛び交うはずです。そのうちの 1 つが認識されることを願っています。
ghc フラグ-O0
を付けてコンパイルすると、最適化を無効にすることができます。これにより、より多くのメソッド名が明らかになります。
編集3
どうやら、proc x -> do
上記のブロックによってコードがコンビネータを生成し、AVFunctor.arr
リフティング メソッドを呼び出していたようです。トップレベル関数を次のように書き換えると
その後、すべて正常に動作します。ガローを学び、使用してみる時が来たと思います(ここバークレーの大学院生による)。
経験からの私の一般的なポイントは、ghci のデバッグがイライラする可能性があるということです。たとえば、ローカル変数として show の引数を作成することはf
できAVFunctor.arr
ましたが、そこから非常に有益なものを取得することはできません。
修正後のソースコードはこちら
haskell - arr と *** / &&& に関して Haskell Arrow インスタンスを定義できないのはなぜですか?
私はまだ、Haskell での Arrows の定義と使用について理解を深めています。新しい矢印を定義するときは、1 つ目と 2 つ目よりも *** や &&& で考える方がはるかに簡単です。ほとんどの場合、2 つの矢印が結合されたときに特別な処理が必要になるからです。
ただし、Arrow クラスでは、arr および *** または &&& に関して矢印を定義することはできず、first の定義を含める必要があります。これは、次のようなコードを書くことを余儀なくされていることを意味します -
Control.Arrow モジュールに「first」のデフォルト定義を含めても害はないように思えます。これにより、first と *** のどちらを定義するかを選択できるようになります。
first のデフォルト定義が Arrow クラスに含まれていないのには正当な理由がありますか? 私が考えることができる唯一の理由は、ユーザーが最初と *** の両方の定義を省略して、循環定義を作成する可能性があることですが、それが唯一の理由ですか?
haskell - GHCの言語拡張機能「Arrows」のソースコードはどこにありますか?
言語プラグマの背後に隠れているソースコードはどこにありますか
それに応じた論文( Paterson、A New Notation for Arrowsなど)を読んだので、理論的に何が起こるかは明らかです。これが実際にどのようにソースコードに変換されるのかを知りたいと思います。
私の検索はすべて、GHCのユーザーガイドまたはControl.Arrowのソースにのみつながります。私はここで何かが欠けていますか?
xml - 単純なXMLからのデータの取得
HXTを使用して、6行のXML入力からいくつかのデータを抽出しようとしています。Curlが統合されていて、後で数千行のXMLファイルが他にもあるので、HXTも保持したいと思います。
私のXMLは次のようになります。
そして、私はそれを解析する方法をまとめようとしてきました。残念ながら、HXTのWikiページは大きな助けにはなりませんでした(または私はただ見落としていました)。
私がいつも得ているのは
したがって、クエリからXMLをチェックして正しく取得したので、解析はひどく間違っているに違いないと思います。
haskell - 矢印のフィルター関数を定義するにはどうすればよいですか?
私は現在、 JohnHughesによるProgrammingwith Arrowsの論文を読んでおり、セクション2.5の20ページの最初の演習ですでに困惑しています。
自由に使える型クラスと型クラス、および型を介した関数、流れ関数Arrow
、モナディック関数のインスタンスがあります。ArrowChoice
[a] -> [b]
a -> m b
Kleisli
mapA
例が示されました:
これが試みです:
この無駄な試みの背後にある(ブルートフォース)理論的根拠は次のとおりです。次の2つの選択肢があります:filterA
likelistcase
とmap
、述語を適用した結果p
。map
それは、リストをチェックし、を使用してEither値を返すように開始しますlistcase
。空のリストg
が適用される場合、それ以外の場合は、の右側のすべてが、およびをそれぞれ含む|||
タイプの値に適用されます。関数が最初に適用されます。これは、を保持しながら述語を適用し、タイプの値を返します。これはに渡され、値に応じて保持するかどうかを決定します。結果を次のように返します(a,[a])
head
tail
h
head
((Bool, head),tail)
(uncurry helper)
head
Bool
Either
選択方法を適用できるように値を設定します(|||)
。この値は次の選択肢に渡されます。つまり、保持されて(j ||| (filterA p))
いる述語が、とを含むペアに適用されるようにします。に適用されている間、を使用してフィルタリングされます。両方の結果がペアとして返されます。次に、このペアはlikeを使用して調整されます。それ以外の場合は、が単独で渡されます。True
j
head
tail
head
id
filter p
tail
arr (uncurry (:))
map
tail
filterA p
私がそれを実現するのと同じくらい難しいとは思えませんが、私はかなり明白な何かを見逃していると思います。
haskell - (map f)== concatMap(map f。(:[]))ですか?
クラス
のストリーム関数(SF)のleft
/メソッドを次のように定義しました。right
ArrowChoice
newtype SF a b = SF { runSF :: [a] -> [b] }
ghciでのいくつかのテストでは、すべてが正常であるように見えます。
しかし、それを一緒に使用すると、別の言い方をしmapA
ます:
正解は次のとおりです。
ここで、mapAは次のように定義されます。