2015-05-07 113 views
10

在Haskell中,许多函数名称只包含符号字符。类似于$$>>=,>>,:,->, =>,=~带符号字符的函数名称使搜索困难

由于我是Haskell的新手,我发现很难在Google中搜索他们的含义。例如,要了解什么->在Haskell中的含义,我需要使用搜索字符串hyphen followed by greater than,这不是最好的方法,按照我的说法。

有没有可以用符号搜索函数的地方?

+0

Radio Erewan的回答:原则上是的,但 - >不是函数......它是一个类型构造函数。 – Ingo

+7

您可以使用[hoogle](https://www.fpcomplete.com/hoogle)来搜索Haskell功能,它对于运营商来说非常合适。但是,' - >'不会出现,因为它是Haskell语法的一部分,不是运算符(就像'=>')。 – bheklilr

+4

使用[Hoogle](https://www.haskell.org/hoogle/?hoogle=( - %3E))或[Hayoo](http://hayoo.fh-wedel.de/?query=-%3E )但不是说这些被称为运营商 – Carsten

回答

19

是的,这是Google的一个已知错误。你可能会考虑更好的搜索引擎,如Hoogle

一般而言,您需要查看实际功能的文档。要做到这一点,你需要知道它的定义在模块中。确定这个最简单的方法是将你的源文件加载到GHCi中(这样你就可以进行所有的导入等),然后询问运营商的:info正是如此:

Prelude> :info (>>=) 
class Monad (m :: * -> *) where 
    (>>=) :: m a -> (a -> m b) -> m b 
    ... 
    -- Defined in ‘GHC.Base’ 
infixl 1 >>= 
Prelude> 

如果类型签名是不够的,那么这也告诉你,你需要谷歌GHC.Base模块和Monad类型类。本身这是非常可以谷歌,但如果该类型关键字不存在,你会做的是谷歌GHC.Base,第一个结果导致the base package overview page。一旦你在那里然后你在模块列表下寻找一个标有[Index]的小链接(GHC.Base有一个巨大的模块列表,所以在这种情况下更容易错过)。

点击该链接会将您带到索引该包装中的所有公共符号;您可以单击>字符查找所有以大于号开头的运算符。然后您将有三个导出该功能的模块链接;点击一个和Ctrl-F查找下列文件:

(>>=) :: forall a b. m a -> (a -> m b) -> m b | infixl 1 | Source 
    Sequentially compose two actions, passing any value produced by the first 
    as an argument to the second. 

再次,Hoogle这是否rigamarole你的一切,有一些其他时髦的功能,如搜索按类型签名。

类的东西<-->=>这是功能,你只需要知道的语言。 <-(“from”)的含义是来自“do-notation”,您可以Google; ->(“to”)的含义取决于它是否出现在lambda表示法中(如\a b -> b),case-expressions或函数的类型签名(其中a -> b -> c表示“函数需要a并返回函数这需要一个b和返回一些c”的=>意思是‘在Haskell约束’或‘类型类’。

除了->,你有时可以看到运营商出现在类型签名了。这些应该是通过上述程序搜索

  1. 这是假设一个稳定的API包。如果API已更改,则需要使用ghc -v查找该文件正在使用的软件包版本,然后单击该版本。
+0

您也可以直接跳转到[hoogle](https://www.haskell.org/hoogle/?hoogle=%28%3E%)来跳过查找软件包的GHCi步骤3E%3D%29)或[hayoo](http://hayoo.fh-wedel.de/?query=%28%3E%3E%3D%29)并搜索运算符(将其括在括号中)。 – mhwombat

+0

@mhwombat我两次提到hoogle,虽然hayoo也是一个很好的链接,值得在这里提及。 –

+0

这不是一个错误,它是一个功能! – AJFarmar