问题

关于Haskell的奇妙之处.函数的类型几乎决定了它的实现.这是这个例子,但....我的大脑只是没有包装嵌套函数在这里:

 mkDyn :: (Typeable a) => ((a -> IO()) -> IO ()) -> ((Dynamic -> IO()) -> IO ())
 

唯一的问题是如何处理将需要的fromDynamic调用中的错误处理,但...一旦我找出了其他问题,我可以处理这个问题.我猜测需要在某个地方有类似的东西.但我似乎无法找到lambda包装器的东西.

 case fromDynamic x of
  Just x -> f x
  Nothing -> undefined -- TODO 
 

  最佳答案

我想你想要toDyn,而不是fromDynamic.所以让我们慢慢这样做:

 mkDyn :: Typeable a =>
         ((a -> IO ()) -> IO ())
      -> (Dynamic -> IO ())
      -> IO ()
mkDyn k f = ...
 

我们的返回类型应该是IO (),我们可以通过调用kf来获得.调用f对我们没有多大帮助,因为我们会以某种方式实现Dynamic,但我们无法从k(明智地)这样做.所以我们想调用k.k需要另一个函数作为参数,所以让我们开始这样:

 mkDyn k f = k ( -> ...)
 

所以函数的参数是Typeable a => a -> IO ().我们没有这种类型的函数,但我们有一个类型为Dynamic -> IO ()的函数.由于Typeable约束,我们可以使用toDyn将我们的a转换为Dynamic并得到:

 mkDyn k f = k ( -> f (toDyn a))
 

有更简单的实现(例如,return ()k ( -> return ()),但这个似乎有意义。

  相同标签的其他问题

haskell