我想撰写一个回传串列最长前缀的函式,将函式应用于该前缀中的每个项目会产生一个严格升序的串列。
例如:
longestAscendingPrefix :: Ord b => (a -> b) -> [a] -> [a]
longestAscendingPrefix _ [] = []
longestAscendingPrefix f (x:xs) = takeWhile (\y z -> f y <= f z) (x:xs)
此代码片段在标题中生成错误讯息。似乎问题在于该 lambda 函式。
uj5u.com热心网友回复:
takeWhile
有型别takeWhile :: (a -> Bool) -> [a] -> [a]
。因此,第一个自变量是将串列的元素映射到 a 的函式Bool
。您的 lambda 表达式具有 type Ord b => a -> a -> Bool
,这没有多大意义。
您可以通过以下方式使用显式递回:
longestAscendingPrefix :: Ord b => (a -> b) -> [a] -> [a]
longestAscendingPrefix f = go
where go [] = []
go [x] = …
go (x1:x2:xs) = …
您需要在其中填写…
最后一个对 . 进行递回呼叫的部分go
。
0 评论