繁体   English   中英

什么“!!”在haskell中意味着什么?

[英]What does “!!” mean in haskell?

Haskell wiki网站上有两个函数:

功能1

fib = (map fib' [0 ..] !!)
    where
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

功能2

fib x = map fib' [0 ..] !! x
    where
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

什么是“!!” 意思?

这实际上更难以阅读,然后它首先看起来像haskell中的运算符比其他语言更通用。

我们都想告诉你的第一件事就是自己去看看。 如果你还不知道hoogle,那么现在是时候熟悉它了。 你可以要求它告诉你一个函数通过名称做什么或(这更酷)你可以给它一个函数的类型,它可以提供关于哪个函数实现该类型的建议。

这是hoogle告诉你的关于这个函数(运算符)的内容:

(!!) :: [a] -> Int -> a

List index (subscript) operator, starting from 0. It is an 
instance of the more general genericIndex, which takes an index     
of any integral type.

让我们假设您需要帮助阅读此内容。 第一行告诉我们(!!)是一个函数,它接受一个事物列表( [a] ),然后一个Int然后返回列表中的a东西( a )。 描述会告诉您它的作用。 它将为您提供由Int索引的列表元素。 所以, xs !! i xs !! i工作方式就像Java,C或Ruby中的xs[i]

现在我们需要谈谈运营商如何在haskell中工作。 我不打算在这里给你完整的东西,但我至少会告诉你,在这里还有更多东西,然后你将在其他编程语言中遇到什么。 运算符“总是”接受两个参数并返回一些东西( a -> b -> c )。 你可以像普通函数一样使用它们:

add x y
(+) x y -- same as above

但是,默认情况下,您也可以在表达式之间使用它们(这个词是'中缀')。 您还可以使正常函数像具有backtics的运算符一样工作:

x + y
x `add` y -- same as above

是什么让你给出的第一个代码示例(特别是对于新的haskell编码器)是!! 运算符用作函数,而不是典型的运算符(中缀)位置。 让我添加一些绑定,以便更清楚:

-- return the ith Fibonacci number
fib :: Int -> Int  -- (actually more general than this but do't worry about it) 
fib i = fibs !! i
    where
      fibs :: [Int]
      fibs = map fib' [0 ..]

      fib' :: Int -> Int
      fib' 0 = 0
      fib' 1 = 1
      fib' n = fib (n - 1) + fib (n - 2)

您现在可以回到示例1.确保您了解map fib' [0 ..]含义。

我很抱歉你的问题被投票了,因为如果你理解了答案的内容很容易查找,但如果你不知道运营商是否存在于haskell,那么很难在精神上解析上面的代码。

(!!):: [a] - > Int - > a

列表索引(下标)运算符,从0开始。它是更通用的genericIndex的一个实例,它接受任何整数类型的索引。

见这里: http//www.haskell.org/ghc/docs/latest/html/libraries/base/Data-List.html#g:16

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM