我试图得到一个程序,它提供了所有可能的方法来交换一个组件到一个新的组件,基于一个新的组件和一个列表。我的目标是写一些简单的东西,比如:
max3 :: Ord a => a -> a -> a -> a
max3 a b c
      | a > b && a > c = a
      | b > a && b > c = b
      | c > a && c > b = c
      | otherwise = error "."例如:
replacements :: a -> [a] -> [[a]]
replacements 'x' "abc" == ["xbc","axc","abx"]
replacements 1 [] == []发布于 2019-10-23 14:34:18
下面是编写replacements的一种方法
replacements :: a -> [a] -> [[a]]
replacements _ [] = []
replacements x (y:ys) = (x:ys) : map (y:) (replacements x ys)要理解递归,可以更详细地编写如下所示:
replacements :: a -> [a] -> [[a]]
replacements _ [] = []
replacements x (y:ys) =
  let first = x:ys
      recur = replacements x ys
      rest = map (\x_with_ys -> y:x_with_ys) recur
  in first : rest用手工方法对前者进行replacements 'x' "abc"评价
   replacements 'x' "abc"
~> ('x':"bc") : map ('a':) (replacements 'x' "bc")
~> "xbc" : map ('a':) (('x':"c") : map ('b':) (replacements 'x' "c"))
~> "xbc" : map ('a':) ("xc" : map ('b':) (('x':[]) : map ('c':) (replacements 'x' "")))
~> "xbc" : map ('a':) ("xc" : map ('b':) ("x" : map ('c':) []))
~> "xbc" : map ('a':) ("xc" : map ('b':) ("x" : []))
~> "xbc" : map ('a':) ("xc" : map ('b':) ["x"])
~> "xbc" : map ('a':) ("xc" : ["bx"])
~> "xbc" : map ('a':) ["xc", "bx"]
~> "xbc" : ["axc", "abx"]
~> ["xbc", "axc", "abx"]正如Ness所暗示的,您可能希望用高阶函数来表示这一点,而不是显式递归。要详细说明威尔的暗示,试着和inits和tails玩一玩
λ> import Data.List
λ> inits "abc"
["","a","ab","abc"]
λ> tails "abc"
["abc","bc","c",""]
λ> zip (inits "abc") (tails "abc")
[("","abc"),("a","bc"),("ab","c"),("abc","")]然后看看zipWith。(在李亚赫中有一些报道)
我也不知道max3与这个问题有什么关系,但是编写max3的另一种方法是:
max3 :: Ord a => a -> a -> a -> a
max3 a b c = max a (max b c)https://stackoverflow.com/questions/58523226
复制相似问题