Haskell:对于数组中的每个偶数,将一个int连接到最终列表

3lxsmp7m  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在写一个函数,它把一个整数和一个整数数组作为参数,对于数组中的每个偶数值,它把整数连接到最后一个数组中。所以,类似这样:f 3 [1,2,3,4,5,6] = [1,2,3,3,4,3,5,6,3]
这是我想象的代码将工作(我刚刚开始,所以很抱歉,如果它是坏的):

f :: Int -> [Int] -> [Int]
f(x,[]) = []
f(x,y) 
    |even head(y) = (head(y) ++ [x] ++ f(x,drop 1 y)
    |otherwise = head(y) ++ f(x,(drop 1 y))

我得到的错误是“无法将预期的'Int'类型与实际类型(a3,a3)匹配”。我知道参数类型不匹配,但我不确定此处的正确语法是什么样子

am46iovg

am46iovg1#

你使用(x, []),这意味着输入类型是一个元组,所以f :: (Int, [Int]) -> [Int]
我还将使用模式匹配来代替headtail,因此:

f :: Int -> [Int] -> [Int]
f _ [] = []
f x (y:ys)
    | even y = y : x : f x ys
    | otherwise = y : f x ys

您还可以泛化类型签名,并使用内部函数来避免每次都传递x

f :: Integral a => a -> [a] -> [a]
f x = go
  where go [] = []
        go (y:ys)
          | even y = y : x : go ys
          | otherwise = y : go ys
ffdz8vbo

ffdz8vbo2#

另一种方法是使用右折叠在偶数后面插入所需的元素。

f :: Int -> [Int] -> [Int]
f x lst = foldr (\y i -> if even y then y:x:i else y:i) [] lst

我们可以将其简化为:

f :: Int -> [Int] -> [Int]
f x = foldr (\y i -> if even y then y:x:i else y:i) []

请注意,如果不指定类型,f的更一般的推断类型将是:

f :: (Foldable t, Integral a) => a -> t a -> [a]

相关问题