gpt4 book ai didi

debugging - haskell -- -ddump-simpl 是获得具体类型的最佳方法吗?

转载 作者:行者123 更新时间:2023-12-03 08:08:27 24 4
gpt4 key购买 nike

我以前写过一个似乎可以工作的函数,但不幸的是我没有很好地编写代码,现在必须再次弄清楚[我正在修改我正在使用的 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

我想得到 get_ast2 的具体类型.我似乎可以添加标志 -ddump-simpl并通过我的终端输出 grep 直到我找到,(清理了一点)
(((β, Seq SketchAST), Seq SketchAST), LowerSketchData) -> Seq SketchAST

(对不起,这对其他人来说可能是无稽之谈,但关键是它对我有用。)有没有更快/更方便的方法来做到这一点?如果不明显,在这种情况下我所说的“具体”是指上述类型是有用的;知道 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

然后,在 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

另一种方法是给出一个故意错误的类型签名并检查编译器如何提示。
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

这给出了错误:
test.hs:13:19:
The first argument of ($) takes one argument,
but its type `()' has none
In the expression:
<snip>

将错误的类型更改为 () -> () :
test.hs:13:30:
Couldn't match expected type `()'
with actual type `(((β, Seq SketchAST), Seq SketchAST),
LowerSketchData)'
In the second argument of `($)', namely
<snip>

所以现在我们知道类型应该看起来像 (((β, Seq SketchAST), Seq SketchAST), LowerSketchData) -> () .最后一次迭代摆脱了最后的 () ,因为编译器提示:
test.hs:13:19:
Couldn't match expected type `Seq SketchAST' with actual type `()'
In the expression:
<snip>

...所以另一个 ()应该是 Seq SketchAST .

关于debugging - haskell -- -ddump-simpl 是获得具体类型的最佳方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7989052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com