使用lambdabot打印ghci中函数/类的定义

时间:2014-05-31 12:16:52

标签: haskell ghci lambdabot

如何在我的项目或cabal依赖项中定义的函数/类等的ghci(使用lambdabot 2.5 GHCi on Acid)中查看源定义? 例如,假设我有:

module Main where
import System.Random

gen = (random (mkStdGen 0)) :: (Bool,StdGen)

myadd :: Int -> Int
myadd x = 2 * x

main = do
  print "finished"

然后我可以获得有关myaddrandom的信息,但我无法打印来源。这是我在ghci中可以做的事情(使用lambdabot):

*Main GOA> :src foldr
 foldr f z []     = z
foldr f z (x:xs) = f x (foldr f z xs)
*Main GOA> :i myadd
myadd :: Int -> Int     -- Defined at test.hs:7:1
*Main GOA> :src myadd
 Source not found. I don't think I can be your friend on Facebook anymore.
*Main GOA> :i random
class Random a where
  ...
  random :: RandomGen g => g -> (a, g)
  ...
    -- Defined in ‘System.Random’
*Main GOA> :src random
 Source not found. Listen, broccoli brains, I don't have time to listen to this trash.

lambdabot似乎能够打印foldr的定义,但不能打印定义的函数 项目(myadd)或cabal依赖项中的函数(random)。

我是否可以使用lambdabot的某些功能打印出myaddrandom等内容的定义?我知道你可以使用Hoogle来random,但我想知道是否有任何方法可以使用ghci或lambdabot来打印源定义。

[编辑]

自发布以来,我发现Emacs/Inferior Haskell processes以及其中的某些功能似乎可以实现上述某些功能。

1 个答案:

答案 0 :(得分:1)

Lambdabot src无法做到这一点。它基于lambdabot本身附带的函数定义的简短列表,参见https://github.com/mokus0/lambdabot/blob/master/lambdabot/State/source。因此,它有时是谎言,例如foldr目前在ghc的库中被定义为

foldr k z = go
      where
        go []     = z
        go (y:ys) = y `k` go ys