Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何获取Leksah中do块内的术语类型?_Haskell_Ide_Leksah_Sodiumfrp - Fatal编程技术网

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

Haskell 如何获取Leksah中do块内的术语类型?,haskell,ide,leksah,sodiumfrp,Haskell,Ide,Leksah,Sodiumfrp,问题以录像形式提出: 文本格式的问题:如何让Leksah告诉我下面代码中的unlisten类型 代码取自 如果Leksah无法实现这一点(在do块中获取一种类型的术语),那么如何提取该信息呢?是否有其他Haskell工具或IDE可以做到这一点 module Main where import FRP.Sodium import Control.Applicative import Control.Monad import Control.Monad.Trans import Data.Char

问题以录像形式提出:

文本格式的问题:如何让Leksah告诉我下面代码中的
unlisten
类型

代码取自

如果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
modulemain其中
进口玻璃钢钠
导入控制
进口管制
进口管制.Monad.Trans
导入数据.Char
导入数据.IORef
导入测试.HUnit
main=do
putStrLn“给我一句话”
event1=TestCase$do

(ev,push)这是一个棘手的问题,有许多不同的解决方案(ghc mod、ide后端和其他)。目前,我认为将
ide后端
集成到Leksah中可能是正确解决此问题的最佳方法

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

unlisten :: () <- listen ev $ \letter -> modifyIORef outRef (++ [letter])
unlisten::()modifyIORef outRef(++[字母])
您应该会得到一个错误,其中包括推断出的
unlisten
类型。执行此操作时,您可能会遇到一个错误,要求您打开
ScopedTypeVariables
。如果是这样,请按Ctrl+R
,Leksah应将
{-#语言范围的TypeVariables}
添加到文件顶部,以便打开它

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

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