如何在Leksah的do块中获取术语的类型?

时间:2015-06-09 04:47:19

标签: haskell ide leksah sodiumfrp

视频格式问题:http://youtu.be/3_pvK-gcLMM

问题的文本格式:我如何让Leksah在下面的代码中告诉我module Main where import FRP.Sodium import Control.Applicative import Control.Monad import Control.Monad.Trans import Data.Char import Data.IORef import Test.HUnit main = do putStrLn "Give me a line" event1 = TestCase $ do (ev, push) <- sync newEvent outRef <- newIORef "" sync $ do push '?' unlisten <- sync $ do push 'h' unlisten <- listen ev $ \letter -> modifyIORef outRef (++ [letter]) push 'e' return unlisten sync $ do push 'l' push 'l' push 'o' unlisten sync $ do push '!' out <- readIORef outRef assertEqual "event1" "hello" =<< readIORef outRef 的类型?

代码取自https://github.com/SodiumFRP/sodium/blob/master/haskell/examples/tests/unit-tests.hs

如果Leksah无法做到这一点(要在do块中获取一个术语类型),那么如何提取该信息呢?是否有其他Haskell工具或IDE可以做到这一点?

{{1}}
编辑:似乎haskell-vim-now现在可以做到:

enter image description here

以某种方式在Leksah中拥有相同的内容会很高兴。

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,有许多不同的解决方案(ghc-mod,ide-backend等)。目前我认为将ide-backend整合到Leksah可能是解决这个问题的最佳方法。

我发现自己使用了一些时间,有些笨重的工作。指定类型为()并让编译器抱怨它不是。例如,如果您更改代码,就像这样...

unlisten :: () <- listen ev $ \letter -> modifyIORef outRef (++ [letter])

您应该收到包含推断类型unlisten的错误。执行此操作时,您可能会收到错误,要求您启用ScopedTypeVariables。如果是,请按Ctrl+R,Leksah应将{-# LANGUAGE ScopedTypeVariables #-}添加到文件顶部,以便您将其打开。

这种方法的一个优点是,即使您的代码无法编译也能正常工作(我不确定其他方法如何处理损坏的代码)。

我认为您也可以通过将unlisten重命名为_unlisten来将其更改为类型漏洞,但这仅适用于名称而不适用于任何表达式,如果您不重命名所有匹配项你可能得到一个不同的推断类型。