在Haskell中查找类型签名
我正在玩Haskell中的一个小型服务器。 作为练习,我手动添加类型签名。
import System.Posix (installHandler, sigPIPE, getFileStatus, fileSize, Handler(..))
import Network (listenOn, accept, PortID(..))
import qualified Data.ByteString.Lazy as B
import Data.Binary
import Network.Socket (close)
import Control.Monad (forever, replicateM_)
import System.Environment (getArgs)
import System.IO (hGetContents, hPutStr, hSetBinaryMode, withFile, hClose, IOMode(..))
...
--here's what I want to add a type signature to
processRequest h = do
s <- hGetContents h
let req = takeWhile (/= "r") $ lines s
mapM_ (x -> putStrLn $ "> "++x) req
return $ words (head req) !! 1
那么应该有一个简单的方法来解决这个问题,让我们看看GHCI的类型推断如下:
Prelude> :l tinyserver.hs
[1 of 1] Compiling Main ( tinyserver.hs, interpreted )
Ok, modules loaded: Main.
*Main> :info processRequest
processRequest :: GHC.IO.Handle.Types.Handle -> IO String
-- Defined at tinyserver.hs:26:1
这是一个很大的类型。 好的,我们来添加它:
processRequest :: GHC.IO.Handle.Types.Handle -> [Char] -> IO ()
processRequest h = do
...
这应该做到这一点。 GHCI很酷吗?
*Main> :l tinyserver.hs
[1 of 1] Compiling Main ( tinyserver.hs, interpreted )
tinyserver.hs:26:19:
Not in scope:
type constructor or class ‘GHC.IO.Handle.Types.Handle’
Failed, modules loaded: none.
呸。 也许这个名字太长了。 让我们尝试所有的孩子类型:
processRequest :: IO.Handle.Types.Handle -> [Char] -> IO ()
processRequest :: Handle.Types.Handle -> [Char] -> IO ()
processRequest :: Types.Handle -> [Char] -> IO ()
processRequest :: Handle -> [Char] -> IO ()
不,他们都给了我同样的结果。
找到这些类型的正确方法是什么? GHCI? Hoogle? 还有别的吗?
链接地址: http://www.djcxy.com/p/43059.html上一篇: Finding type signatures in Haskell
下一篇: Find type class instance for Shapeless HList in Scalaz state monad