Haskell 如何获取Leksah中do块内的术语类型?
问题以录像形式提出: 文本格式的问题:如何让Leksah告诉我下面代码中的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
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
将其更改为类型孔,但这仅适用于名称,而不适用于任何表达式,而且如果您不重命名所有引用,您可能会得到不同的推断类型