2

Kansas Lava で少し bool に変換する関数を書いています。これには 2 つの方法がありますが、どちらも機能しません。

関数は次のことを行う必要があります。

  • ビットを受信 (ローまたはハイ)
  • 対応するブール値に変換します => 低い場合は False、高い場合は True

最初の方法:

bitToBool :: Signal i Bool -> Bool
bitToBool x
  | x==low = False
  | otherwise = True

このメソッドでは、「Exception: undefined: Eq over a signal」というエラーが表示されます

2 番目の方法:

bitToBool :: Signal i Bool -> Bool
bitToBool low = False
bitToBool high = True

このメソッドは、入力が高い場合でも常に False を返します。これはうまくいくはずです。なぜなら、別のコードではこれと逆のことをしているからです。

ここで何が間違っていますか?

助けてくれてありがとう

大安

4

1 に答える 1

4

答えは…</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 ELit後者のコンストラクタの 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 は、質問のコメントで重要な問題を提起しています。コンストラクターがエクスポートされている場合でも、シグナルの表現にアクセスすることになっていますか? –デュプロード

ただし、元の質問の両方が回答されているため、最終的にはあなたの動機に依存します. 残念ながら、「それは理にかなっていますか」という新たな疑問に私は答えることができません。

于 2014-05-05T08:56:51.737 に答える