拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 无法将预期型别“Bool”与实际型别“a->Bool”匹配

无法将预期型别“Bool”与实际型别“a->Bool”匹配

白鹭 - 2022-03-15 1948 0 0

我想撰写一个回传串列最长前缀的函式,将函式应用于该前缀中的每个项目会产生一个严格升序的串列。

例如:

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *