gat*_*ado 3 debugging haskell types ghc concrete
我以前编写过一个似乎有效的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的monad变换器堆栈].
run_astvn ::
LowerMonadT (StateT LowerSketchData Identity) ?
-> Seq SketchAST
run_astvn x = get_ast2 $ runIdentity $
runStateT (runStateT (runStateT x empty) empty)
(LowerSketchData Set.empty)
where get_ast2 = snd . fst
Run Code Online (Sandbox Code Playgroud)
我想得到具体的类型get_ast2.我似乎能够-ddump-simpl通过我的终端输出添加标志和grep,直到我找到,(清理了一点)
(((?, Seq SketchAST), Seq SketchAST), LowerSketchData) -> Seq SketchAST
Run Code Online (Sandbox Code Playgroud)
(对不起,这对其他人来说可能是胡说八道,但关键是它对我有用.)有更快/更方便的方法吗?如果不是很明显,在这种情况下我所说的"具体"是指上述类型是有用的; 知道的类型snd . fst不是:).
我目前有两种方法可以做到这一点,而且它们都是黑客攻击.第一种是使用隐式参数:
{-# LANGUAGE ImplicitParams #-}
import Control.Monad.State
import Control.Monad.Identity
import Data.Sequence
import qualified Data.Set as Set
data LowerSketchData = LowerSketchData (Set.Set Int)
type LowerMonadT m = StateT (Seq SketchAST) (StateT (Seq SketchAST) m)
data SketchAST = SketchAST
--run_astvn ::
-- LowerMonadT (StateT LowerSketchData Identity) ?
-- -> Seq SketchAST
run_astvn x = ?get_ast2 $ runIdentity $
runStateT (runStateT (runStateT x empty) empty)
(LowerSketchData Set.empty)
-- where get_ast2 = snd . fst
Run Code Online (Sandbox Code Playgroud)
然后,在ghci:
*Main> :t run_astvn
run_astvn
:: (?get_ast2::(((a, Seq a1), Seq a2), LowerSketchData) -> t) =>
StateT
(Seq a1) (StateT (Seq a2) (StateT LowerSketchData Identity)) a
-> t
Run Code Online (Sandbox Code Playgroud)
另一种方法是给出一个故意错误的类型签名并检查编译器如何抱怨.
import Control.Monad.State
import Control.Monad.Identity
import Data.Sequence
import qualified Data.Set as Set
data LowerSketchData = LowerSketchData (Set.Set Int)
type LowerMonadT m = StateT (Seq SketchAST) (StateT (Seq SketchAST) m)
data SketchAST = SketchAST
run_astvn ::
LowerMonadT (StateT LowerSketchData Identity) ?
-> Seq SketchAST
run_astvn x = get_ast2 $ runIdentity $
runStateT (runStateT (runStateT x empty) empty)
(LowerSketchData Set.empty)
-- where get_ast2 = snd . fst
where get_ast2 :: (); get_ast2 = undefined
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
test.hs:13:19:
The first argument of ($) takes one argument,
but its type `()' has none
In the expression:
<snip>
Run Code Online (Sandbox Code Playgroud)
将错误的类型更改为() -> ():
test.hs:13:30:
Couldn't match expected type `()'
with actual type `(((?, Seq SketchAST), Seq SketchAST),
LowerSketchData)'
In the second argument of `($)', namely
<snip>
Run Code Online (Sandbox Code Playgroud)
所以现在我们知道类型应该是这样的(((?, Seq SketchAST), Seq SketchAST), LowerSketchData) -> ().最后一次迭代摆脱了最后一次(),因为编译器抱怨:
test.hs:13:19:
Couldn't match expected type `Seq SketchAST' with actual type `()'
In the expression:
<snip>
Run Code Online (Sandbox Code Playgroud)
......所以另一个()应该是Seq SketchAST.