如何创建一个函数iterator xs f,其中xs是一个列表,f是Haskell中的一个函数

1 haskell list

我正在尝试编写一个iterator我可以使用 的函数iterator l f,其中l是一个Int数字列表,f是一个单参数函数.该iterator函数应检查当f函数应用于列表的第一个元素时,它= =列表的第二个元素,依此类推所有元素.如果每个元素f都应用于前一个元素,它应该返回true .

它应该像这样工作:

iterator [3,4,5] (+1) -> True
iterator [2,4,5] (+1) -> False
Run Code Online (Sandbox Code Playgroud)

我试图编写一个函数,它接受列表和f函数,并检查列表头部和第二个函数是否为真,然后在迭代器函数map中应用于列表的该函数,但它不是编译和我不知道我的想法是否正确.

这是我最近的尝试:

func xs f1 
      | null xs = False
      | ((head xs) f1)==(head(tail xs))=True
      | otherwise = False  
iterator l f 
      | null l = False
      | map (func l f) l ==True=True
      | otherwise = False
Run Code Online (Sandbox Code Playgroud)

Wil*_*ess 5

这是你的意思吗?

iterator :: (Eq a) => [a] -> (a -> a) -> Bool
iterator xs f = and . zipWith (==) xs . iterate f . head $ xs
Run Code Online (Sandbox Code Playgroud)

这符合你的直觉:列表迭代所提供函数的结果,从列表的head元素开始.

我们可以写,iterator xs f = xs == take (length xs) (iterate f $ head xs)但使用length会减少在线.如果我们想内嵌的定义==,take,length并融合他们,结果将是我们的zipWith代码.

测试:

Prelude> iterator [3,4,5](+1)
True
Prelude> iterator [2,4,5](+1)
False