2015-06-09 9 views
2

Вопрос в видео формате: http://youtu.be/3_pvK-gcLMMКак получить тип термина внутри блока do в Лексах?

Вопрос в текстовом формате: как я могу получить Leksah сказать мне тип unlisten в коде ниже?

Код взят из https://github.com/SodiumFRP/sodium/blob/master/haskell/examples/tests/unit-tests.hs

Если это не представляется возможным с Leksah (чтобы получить тип термина внутри сделай блок), то как можно извлечь эту информацию? Есть ли другой инструмент 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 

EDIT: Кажется, что Haskell-ВИМ-теперь могут сделать это:

enter image description here

Было бы неплохо иметь то же самое в Leksah каким-то образом.

ответ

1

Это сложная проблема с рядом различных решений (ghc-mod, ide-backend и др.). В настоящее время я считаю, что интеграция ide-backend в Leksah - лучший способ исправить это правильно.

Существует немного неуклюжая работа вокруг, которую я нахожу себе несколько раз. Укажите тип, который должен быть (), и пусть компилятор жалуется, что это не так. Например, если изменить код так, как это ...

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

Вы должны получить ошибку, которая включает в себя выведенный тип unlisten. Если вы сделаете это, вы можете получить сообщение об ошибке ScopedTypeVariables. Если да, нажмите Ctrl+R, а Leksah должен добавить {-# LANGUAGE ScopedTypeVariables #-} в начало файла, чтобы вы его включили.

Одним из преимуществ этого подхода является то, что он работает даже тогда, когда ваш код не компилируется (я не уверен, насколько хорошо другие подходы справляются со сломанным кодом).

Я думаю, вы также можете изменить его к типу отверстия путем переименования unlisten в _unlisten, но это работает только для имен, а не любое выражение, а также, если вы не переименовать все вхождения, вы можете получить различные распознанный тип ,

 Смежные вопросы

  • Нет связанных вопросов^_^