問題タブ [lifting]
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 - この無意味なコードを推測する手順は何ですか?
私はいくつかのコードを見直していて、次の宝石に出くわしました。これは、pointfree
出力のコピーアンドペーストであると思います:
(私は、以下が通常よりも適切だと思いましたfoo
/bar
この特定の質問について:P)
(i)coordinates b = (x b, y b)
から
(ii)に単純化するために必要な手順を説明してくれる人は親切でしょうかcoordinates = liftM2 (,) x y
? 特に、背景にモナドが潜んでいることにさえ気づいていなかったので
、 の使用については少し混乱しています。liftM2
(i) は次のように表すこともできますがcoordinates s = (,) (x s) (y s)
、どこでどのように進めればよいかわかりません。
PS以下は、それがからだと思われる理由ですpointfree
(出力はからGHCI
であり、:pl
にエイリアスされていpointfree
ます):
haskell - 持ち上げてモナド変換スタックの *内部* を固定する
aにIO Int
ラップされた があり、スタック モナドで使用したいStateT MyState
値があるとします。State MyState Int
この内的な意味でそれを持ち上げるにはどうすればよいですか?私はすでに外側のモナドに持ち上げる必要がある内部と互換性のあるものを使用することを知っていますlift
がliftIO
、今は逆の問題があります: 値はすでに外側のモナドにありますが、内側のモナドにはありません。
例えば:
状態を「取得」し、それを runState に手で押し込み、すべてを再度ボックス化する必要がありますか、それともこれを行う一般的な方法はありますか?
StateT MyState IO a
ところで、その sim パラメータは IO とは何の関係もない一連のステートフル関数であるため、回避できる場合はそれらすべてを返すことに少し気が進まないのです。
matlab - ハールリフティングスキーム
リフティング スキーム バージョン haar を画像に適用しようとしています。インターネットに投稿されたコードを使用して適用を開始しました。
実際、上記のコードは、LEVEL1 のリフティング Haar ウェーブレットを適用します。2 レベルまたは 3 レベルのリフティング Haar ウェーブレットを適用するには、このコードをどのように変更すればよいですか?
どんな助けでも大歓迎です!
クリスティーナ
haskell - モナドスタックを平坦化
だから私は最初の本格的な haskell プロジェクト全体にこの種のコードを持っています:
私の目標を達成しようとする方法には間違いなく何か問題があるかもしれません (もっと簡単な方法があるかもしれません) が、現在、モナド変換子のスタックをより良い方法で処理する方法を学ぶことに興味があります。r
これは、スタック内のより高いモナドにコンテキストを取得してB
持ち上げる方法を見つけた唯一の方法です。最初のステートメントの代わりにブロック全体を持ち上げることは、私が自分でできる限りです。
私がしばしば行き着くのは、深いモナドがlift
である場合に回避できることがわかったチェーンです。ただし、他のモナドの一般的な方法については知りません。liftIO
IO
そのようなスタックを処理し、あるレベルで 1 つの値を抽出し、別のレベルで別の値を抽出し、これらを組み合わせて 2 つのレベルのいずれかに影響を与えたり、さらに別のレベルに影響を与えたりする必要がある場合に従うことができるパターンはありますか?
ブロック全体を持ち上げたり (let
バインドされた変数の範囲を限定したり、内側のブロックに制限したりする)、lift . lift . ... lift
個々のアクションを実行することなく、スタックを何らかの方法で操作できますか?
haskell - モナドの整理 - モナド変換子のアプリケーションを newtype モナドに変える
私はExceptT a (StateT A M)
、いくつかの具象型A
とモナドのために、例えば、を取りM
、それらを新しいカスタムモナドにラップしようとしています。
最初にStateT A M
、 が他のコンテキストで頻繁に現れることを特定したので、それだけをモナドでラップしてから でラップするのが最善であると判断しM1
ましExceptT a M1
たM2
。
必要なプロパティは、のインスタンスとのクラスを作成M1
するM2
ことMonadState
ですM
(それが呼び出されたと仮定しましょうMyMonadClass
)。のインスタンスでもM2
ある必要がありますMonadError
。
まず、単純な型のシノニムから始めました。
次に、最初にインスタンス宣言を(インスタンスを実装せずに)スケッチすると思いましたが、そこで最初に行き詰まりました。instance MonadState A (MyState)
正しい構文ではないようです。newtype MyState' a = StateT a M
作成してから作成する必要があると思いましたtype MyState = MyState A
(必要のない言語拡張機能は使用しないでください)。
しかし、シノニムを宣言に変換し始めると、 and型newtype
への接続が失われ始めました。StateT A M
ExceptT ...
すでに実装されているトランスフォーマーは姿を消し、あまり意味のないことをしようとしていると思います。だから私の質問は次のとおりです: この種の動作を新しい複合モナドに正しくラップして、下にあるレイヤーにアクセスできるようにすることで、不必要な持ち上げを回避し、物事を明確に整理することができます。
haskell - リフトなどの多態性関数の型制約
だから私はこのコードを持っています
m
そして、コンパイラは、 from 署名がlift
型であることを証明できない、MonadA
またはそれがこれらの不可解なエラーメッセージの読み方であると不平を言っています。
これに対処する方法はありますか?次のようにインスタンス化できるようにするには、制約が必要だと思います。
また、そのようなf
作業の実装はありますか? (上記のエラーのため、そこまで到達しませんでした)。内側のモナドの上f
に解決するために右側に願っています。f
a
編集newtype MonadA a => MyStateT ...
:私が言及した正確なエラーを回避するために、型制約を削除するのに実際に役立ちました。ただし、以前に同じことが原因であると考えていた別のエラーがありました。上記のサンプル コードの続きを考えてみてください (いくつかの部分が繰り返され、現在は型の制約がありません)。
エラーは
の実装でfB
。以前、私はclass MonadA m => MonadB m
役に立たなかった。a
とマッチングしても意味がありませんStateT A m
。それMyStateT
のインスタンスはMonadState A
機能するはずなので、いいえ?
編集:
OK、うまくいきました:
愚かな私。
haskell - Haskell: リストで動作するように持ち上げることができるような関数を書く
次の2つの機能があります。
noneOnEmptyA
1) 機能を達成し、2) 機能を達成するように持ち上げることができる単一の関数を作成することは可能noneOnEmptyB
ですか? 問題の核心は、空のリストをチェックしnoneOnEmptyA
ながら空のテキストをチェックすることです。noneOnEmptyB
ただし、noneOnEmptyA
リストを操作するために持ち上げられた ( fmap noneOnEmptyA
type を返す場合のよう[T.Text]
に) リスト自体が空であるかどうかをチェックするのではなく、リスト内の空のテキストをチェックします。
haskell - 選択したものを自動的に ExceptT に持ち上げます
私がこの(間違いなく誤解を招く)コードの一部を置いているとしましょう:
ghc
次のエラーが表示されます。
を に持ち上げる最も標準的な方法は何Either
ですかExceptT
? Either String
のインスタンスなので、何らかの方法があるに違いないと感じていますMonadError
。
私は自分のリフティング関数を書きました:
しかし、私はすでに
ExceptT
モナド変換子の内部で作業しているので、これはまだ間違っていると感じています。
ここで何が間違っていますか?コードを別の方法で構成する必要がありますか?
haskell - 持ち上げられた「if」関数が予期しない動作をする
私のプログラムif'
では、組み込み構造の代わりに、モジュールの 1 つで定義された関数を使用していますif-then-else
。それは自明に定義されており、うまく機能します。
ただし、モナド値に適用する必要があるコードの場所が 1 つあります (IO
私の場合)。つまり、型シグネチャは のようになりますIO Bool -> IO a -> IO a -> IO a
。当然、持ち上げてみました。
しかし、式を評価しようとすると、期待どおりの結果が得られません。
<*>
説明に「逐次適用」と書いてあるのは知っているので、そのせいかもしれません。しかし、ここで何が起こっているのでしょうか? まったく新しい専用関数を作成せずに修正できますか?