视频格式问题: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现在可以做到:
以某种方式在Leksah中拥有相同的内容会很高兴。
答案 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
来将其更改为类型漏洞,但这仅适用于名称而不适用于任何表达式,如果您不重命名所有匹配项你可能得到一个不同的推断类型。