答えは…</h2>
このメソッドでは、「Exception: undefined: Eq over a signal」というエラーが表示されます
これはEq、 for のインスタンスSignal c aが次のようになっているためです。
instance (Rep a, Eq a) => Eq (Signal c a) where
-- Silly question; never True; can be False.
(Signal _ _) == (Signal _ _) = error "undefined: Eq over a Signal"
2 つの信号を比較することはできません。
ここで何が間違っていますか?
それはlowor highfromUtilsではなく、代わりにパターン マッチングです。そして、最初のパターンは常に一致するため、常に を返しFalseます。
…パンくずリスト…</h2>
免責事項: 私は Kansas-Lava を使用したことがなく、ハードウェア プログラミングについてもまったく知識がなく、ほとんど Haskell の初心者です。信用を失った今、それを手に入れる旅に出ようBool!
a から何かを取得するには、a が何であるかSignalを知る必要があります。Signal
data Signal (c :: *) a = Signal (S.Stream (X a)) (D a)
素晴らしいです。実際にパターンマッチを行うことができますSignal:
bitToBool (Signal _ d) = ...
で何ができるdでしょうか?私たちの場合dは型を持っています。、、およびヘルパーD Boolの定義を見て、インスピレーションを得ることができます。lowhighpureS
pureS :: (Rep a) => a -> Signal i a
pureS a = Signal (pure (pureX a)) (D $ Lit $ toRep $ pureX a)
high :: (sig ~ Signal i) => sig Bool
high = pureS True
low :: (sig ~ Signal i) => sig Bool
low = pureS False
Repclassに注意してください。後で重要になります。Dは のnewtypeラッパーでDriver E、Lit後者のコンストラクタの 1 つです。toRepしたがって、実際にこの時点までのパターン マッチを行うことができます。
bitToBool (Signal _ d) = case unD d of
Lit r -> ...
_ -> False
toRepデュアルを持っていfromRepます。とpureXはやや二重であり、この場合はまたはunXにつながります。fromを使用して、Kansas Lava コードの小さな旅を終えることができます。Just BoolNothingfromMaybeData.Maybe
bitToBool (Signal _ d) =
case unD d of
Lit r -> fromMaybe False . unX . fromRep $ r
_ -> False
残念ながら、システムに kansas-lava をインストールできなかったため、このソリューションをテストできませんでした。
…そして悲しい現実
aを aに変換できる可能性があることがわかったので、それは賢明ではありません。タイプ check かもしれませんが、そうです。Signal i BoolBoolunsafePerformIO
Signal最後に、コンテキストからブール値を削除しています。ただし、これは最後にハードウェア/VHDL であるため、実際には賢明ではありません。
適切な方法で Signal を Bool に変換することはできません。シグナルは「時間」とともに変化するため、静的ブール値と比較してもほとんど意味がありません。そのため、ビットの比較機能はありません。だから、あなたはここで間違った道を進んでいます。–<a href="https://stackoverflow.com/questions/23467604/haskell-bit-to-bool-error/23468568?noredirect=1#comment35995071_23467604">8 月
実際、私の観点からは、EqとのOrdインスタンスは存在すべきではありません。Signalまた、duplode のヒントとして、一部のコンストラクターはまったくエクスポートしないでください。
augustuss は、質問のコメントで重要な問題を提起しています。コンストラクターがエクスポートされている場合でも、シグナルの表現にアクセスすることになっていますか? –デュプロード
ただし、元の質問の両方が回答されているため、最終的にはあなたの動機に依存します. 残念ながら、「それは理にかなっていますか」という新たな疑問に私は答えることができません。