【问题标题】:From Signal Int to Int in Haskell从 Signal Int 到 Haskell 中的 Int
【发布时间】:2018-11-28 09:52:22
【问题描述】:

我正在使用描述数字电路 (Lava) 的 Haskell 库,它的函数输入和输出是信号类型 (Signal Bool, Signal Int) ,据我所知,没有一个函数可以从Signal Int to Int,我知道有几种算术运算可以与 Signal Int 类型一起使用,但并非所有算术运算都是可能的。我编写了这个函数,假设从 Signal Int 转换为 Int (仅用于我需要的值)。

signalInt2int :: Signal Int -> Int
signalInt2int x = case x of 
    0 -> 0 
    1 -> 1 
    15 -> 15 
    _ -> 1000

只是为了尝试,我只写了这 4 种可能性,问题是每当我调用这个函数时,无论输入是什么,输出总是 1000。我确保使用 Signal Int 类型的输入。这是我得到的。

谁能指出问题出在哪里?我会很感激你的帮助。

【问题讨论】:

  • 您的输入 x 将永远不会匹配 0115 因为 x 是一个列表而不是一个数字,所以你正在匹配 _ 它返回 @987654332 @。其实我认为它不应该编译?
  • 您应该提供一个指向您的Signal 定义的指针。不可能知道它是什么。如果我不得不猜测,信号是取决于时间的值(例如振荡信号),因此我们无法将其转换为单个值。我们能做的最好的事情就是在一个点对信号进行采样,但这并不有趣。通常F IntInt 之间没有转换,对于通用F。例如。我们无法将[Int] 转换为Int,或将Maybe Int 转换为Int
  • @chi 问题中给出了库名称,当然最好包含一个链接。
  • @AlexeyRomanov 我只看到上面提到的“熔岩”,还有multiple packages,所以我不确定。也许是this one

标签: haskell types lava


【解决方案1】:

由于整数文字在 Haskell 中的工作方式,您的代码 is making comparisons x == fromInteger 0, x == fromInteger 1 etc. 所以它取决于 ==fromIntegerSignal Int 实现的方式。

如果您检查sources,会发现fromInteger 总是会创建一个新的Ref,并且不会等于任何现有的Signals。

所以问题仍然存在,如何做你想做的事。模式匹配应该可以工作,但您需要进入Signal 的实际结构,而不是与文字进行比较。如果我做对了(未经测试),这样的事情应该可以工作(返回Maybe Int,因为并非所有Signal Int 信号都是恒定的):

signalInt2int :: Signal Int -> Maybe Int
signalInt2int (Signal (Symbol ref)) = case deref ref of
    Int i -> Just i
    _ -> None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2014-06-02
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多