2

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

文本格式的问题:我怎样才能让 Leksah 告诉我unlisten下面代码中的类型?

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

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

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

编辑:似乎 haskell-vim-now 可以做到:

在此处输入图像描述

以某种方式在Leksah拥有同样的东西会很好。

4

1 回答 1

1

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

我发现自己有时会使用一些有点笨拙的解决方法。指定要成为的类型()并让编译器抱怨它不是。例如,如果您更改代码,则如下所示...

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

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

这种方法的一个优点是即使您的代码没有编译它也可以工作(我不确定其他方法如何处理损坏的代码)。

unlisten我认为您也可以通过将其重命名为 来将其更改为类型孔_unlisten,但这仅适用于名称而不适用于任何表达式,而且如果您不重命名所有出现的事件,您可能会得到不同的推断类型。

于 2015-06-13T03:07:20.877 回答