【问题标题】:Type signature "Maybe a" doesn't like "Just [Event]"类型签名“Maybe a”不喜欢“Just [Event]”
【发布时间】:2010-05-24 08:56:12
【问题描述】:

我还在学习 Haskell,需要类型推断方面的帮助!

使用包 SDL 和 Yampa 我从FRP.Yampa.reactimate 得到以下类型签名:

(Bool -> IO (DTime, Maybe a))

我想将它用于:

myInput :: Bool -> IO (DTime, Maybe [SDL.Event])
myInput isBlocking = do
    event <- SDL.pollEvent
    return (1, Just [event])
...
reactimate myInit myInput myOutput mySF

但它说

无法匹配预期类型 `()' 针对推断类型“[SDL.Event]” 预期类型:IO (DTime, Maybe ()) 推断类型:IO (DTime, Maybe [SDL.Event]) 在 `reactimate' 的第二个参数中,即 `input' 表达式中:reactimate 初始化输入输出过程

我认为Maybe a 允许我使用任何东西,甚至是SDL.Event 列表? 当类型签名实际上是 Maybe a 时,为什么会期待 Maybe ()? 为什么它需要一个空元组,或者一个不带参数的函数,或者() 应该是什么?

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    完整的type signature of reactimate是

    IO a                               -- # myInit
     -> (Bool -> IO (DTime, Maybe a))  -- # myInput
     -> (Bool -> b -> IO Bool)         -- # myOutput
     -> SF a b                         -- # mySF
     -> IO ()
    

    相同的a 和b 必须匹配,这意味着如果您的myInput 具有Bool -&gt; IO (DTime, Maybe [SDL.Event]) 类型,那么所有其他a 也必须是[SDL.Event]。因此,要匹配类型,您需要确保

     myInit :: IO [SDL.Event]     -- # **not** IO ().
     mySF :: SF [SDL.Event] b
    

    顺便说一句,() 是 unit type。

    【讨论】:

    • 最好将其称为 单元类型,至少在这种情况下是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多