我正在尝试编写一个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)
这是你的意思吗?
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