【问题标题】:Haskell perform function on list n number timesHaskell 在列表 n 上执行函数次数
【发布时间】:2021-03-29 12:30:06
【问题描述】:

我正在学习使用 Haskell 进行函数式编程。我正在尝试创建一个函数,该函数采用函数f,并在某些输入xn 上执行该函数的次数。

(a -> a) -> a -> Int -> [a]
repeat f x n

所以,输出列表是这样的:

[x, f(x), f(f(x)), ..., f^n(x)]

到目前为止,我已经能够提出一个我认为可以做到这一点的函数,但我不知道如何约束它,所以它只执行 n 次:

fn f a = (f a) : (fn f (f a))

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您只需要指定两种不同的情况:一种情况下发生递归并且列表继续,另一种情况下不发生递归,并且需要通过某种方式在这些情况之间做出决定。第三个参数n 看起来恰到好处:

    fn f a 0 = []
    fn f a n = f a : fn f (f a) (n-1)
    

    【讨论】:

    • 这是有道理的。谢谢!
    【解决方案2】:

    我来这里是为了提供另一种方式(只是为了好玩)。

    库中有一个非常相似的函数:scanl :: (b -> a -> b) -> b -> [a] -> [b],它执行:

    scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
    

    这与您想要做的非常相似。 所以我们可以这样写:

    fn :: (a -> a) -> a -> Int -> [a]
    fn f a n = scanl (\x _ -> f x) a (replicate n ())
    
    -- or you can write:
    -- fn f a n = scanl (const . f) a (replicate n ())
    

    (\x _ -> f x) 中,我们丢弃了第二个参数(即())。

    注意它是如何工作的:

    fn f a n == [a, (\x _ -> f x) a (), (\x _ -> f x) ((\x _ -> f x) a ()) (), ...]
             == [a, f a, f (f a), ...]
    

    【讨论】:

    • 如果要使用内置函数,take (n+1) (iterate f a) 似乎更简单。
    • 或者实际上是take n $ fn f a
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2012-08-30
    • 2015-02-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多