gpt4 book ai didi

haskell 缓存

转载 作者:行者123 更新时间:2023-12-02 00:47:19 27 4
gpt4 key购买 nike

解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码:

fillRow115 minLength = cache where
cache = ((map fillRow115' [0 ..]) !!)
fillRow115' 0 = 1
fillRow115' cells = sum (map cache [0..cells-minLength]) + cache (cells-1)

我这周刚开始学习 Haskell,似乎无法理解这段代码。有人可以解释一下以下两点吗:

  1. 对我来说,看起来只有一个参数 minLength,但该函数需要 2 个参数才能在 ghci 中运行。这个其他论点在哪里发挥作用?
  2. 根据我在网上找到的信息,!! 是列表索引运算符,当调用 [list] !! 时返回第 n 个元素! n。上面的代码似乎只用一个参数来调用它。它在做什么?

附注如果有人想复制这段代码来解决 Project Euler 问题,它似乎没有给出正确的答案。

最佳答案

这个其他论点在哪里发挥作用?

让我们进一步简化这个问题。您可能了解 head 函数:

head [] = error "something bad"
head (x:_) = x

你可能会犯傻,定义自己的 head 函数,只调用 head:

myHead xs = head xs

请注意左侧和右侧都应用了变量xs,因此我们可以执行所谓的 eta-reduction 并得到:

myHead = head

类型签名可能会强调这一点:

myHead :: [a] -> a
myHead = (head :: [a] -> a)

因此,在您的情况下,fillRow115 采用第二个参数,因为它等于 cache,后者采用一个参数 - 这给我们带来了您的第二个问题。

上面的代码似乎只用一个参数来调用它。它在做什么?

考虑函数+。如果您希望创建一个始终加 2 的函数,您可以“部分应用”2 到函数 +:

addTwo  = (+2)    -- (2+) would work just as well

所以你正在查看列表索引函数!!:

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

并对自己说,这仅适用于某些列表。应用我们对部分应用的了解,我们得到一种类型:

(someList !!) :: Int -> a

所以这实际上是一个从 Ints 到列表元素的函数。

如果尚未点击,只需将 someList 替换为您正在使用的列表:

someList = map fillRow115' [0..]
(someList !!) === ((map fillRow 115' [0..]) !!)

关于 haskell 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17475565/

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