答えは…</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 つの信号を比較することはできません。
ここで何が間違っていますか?
それはlow
or high
fromUtils
ではなく、代わりにパターン マッチングです。そして、最初のパターンは常に一致するため、常に を返し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
の定義を見て、インスピレーションを得ることができます。low
high
pureS
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
Rep
classに注意してください。後で重要になります。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 Bool
Nothing
fromMaybe
Data.Maybe
bitToBool (Signal _ d) =
case unD d of
Lit r -> fromMaybe False . unX . fromRep $ r
_ -> False
残念ながら、システムに kansas-lava をインストールできなかったため、このソリューションをテストできませんでした。
…そして悲しい現実
aを aに変換できる可能性があることがわかったので、それは賢明ではありません。タイプ check かもしれませんが、そうです。Signal i Bool
Bool
unsafePerformIO
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 は、質問のコメントで重要な問題を提起しています。コンストラクターがエクスポートされている場合でも、シグナルの表現にアクセスすることになっていますか? –デュプロード
ただし、元の質問の両方が回答されているため、最終的にはあなたの動機に依存します. 残念ながら、「それは理にかなっていますか」という新たな疑問に私は答えることができません。