【问题标题】:Haskell function that alternatively applies input unary functions交替应用输入一元函数的 Haskell 函数
【发布时间】:2015-12-09 00:06:10
【问题描述】:

我正在尝试编写一个 Haskell 函数,它采用两个一元函数(f 和 g)和一个数字列表(ns),并将这些输入函数 f 和 g 应用于输入列表的元素。

例如:

func double square [2, 3, 4, 5, 6]

会回来

[4, 9, 8, 25, 12]

我正在为我的编译器使用 WinGHCi。任何有关编写此函数的帮助将不胜感激,谢谢。

【问题讨论】:

  • 查看zipWithcycle
  • 我正在尝试不使用库函数,但我看不出 zipWith 有什么帮助...
  • 为什么不使用库函数?
  • @T-Bird:避免使用库函数不是一个好主意。良好的函数式编程风格包括将问题分解成更小的部分,并使用标准库中的通用、可重用函数来解决这些问题。所以最好的策略是(a)使用标准库函数来解决你的问题,然后(b)编写你自己的函数版本作为额外的练习。这是一个递归解决方案,因为您可以在步骤 (b) 中使用其他库函数...

标签: list function haskell input winghci


【解决方案1】:

如果你不想使用任何库函数,你可以使用递归来做到这一点:

func _ _ []     = []
func f g (x:xs) = f x : func g f xs

【讨论】:

  • 单线:interMap f g xs = foldr (\x r f g -> f x : r g f) (\_ _ -> []) xs f g.
【解决方案2】:

扩展@luqui 的评论:

func f1 f2 l = zipWith ($) (cycle [f1, f2]) l

如果您不想使用库函数,只需查看它们的实现,它们非常简单。

【讨论】:

  • 请注意,在这种情况下,您还可以使用id 代替($),这可能更易于阅读。
  • 此外,您可以完全删除l(使其成为隐式参数)以获得更简洁的表达式。
【解决方案3】:

只是一个简单的解决方案...

fun :: (a -> b) -> (a -> b) -> [a] -> [b]
fun f g = reverse . snd . foldl step (0,[])
          where
             step (c,ac) x = (c + 1, (if even c then f x else g x) : ac)

由于您不想使用库函数,您可以在不使用foldl 的情况下重现相同的结果。这个想法很简单,可以使用计数器来知道哪个位置是偶数。

编辑:我的蓄电池有点混乱。现在,它是正确的。

【讨论】:

  • 目标是避免库函数,原因不明。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多