【发布时间】:2021-09-25 12:12:32
【问题描述】:
我想创建一个函数来删除满足第二个参数中给出的谓词的第一个元素。像这样的:
removeFirst "abab" (< 'b') = "bab"
removeFirst "abab" (== 'b') = "aab"
removeFirst "abab" (> 'b') = "abab"
removeFirst [1,2,3,4] even = [1,3,4]
我想通过递归来做到这一点,并想出了这个:
removeFirst :: [a] -> (a -> Bool) -> [a]
removeFirst [] _ = []
rremoveFirst (x:xs) p = if p x then x : removeFirst xs p else removeFirst xs p
(灵感来自this问题) 但我收到一个类型错误,如下所示:
Couldn't match type ‘a’ with ‘Bool’
Expected: [Bool]
Actual: [a]
‘a’ is a rigid type variable bound by
the type signature for:
removeFirst :: forall a. [a] -> (a -> Bool) -> [a]
或者这个:
ghci> removeFirst [1,2,3,4] even
<interactive>:25:1: error:
* Variable not in scope: removeFirst :: [a0] -> (a1 -> Bool) -> t
* Perhaps you meant `rem' (imported from Prelude)
我知道这是一个相对简单的编程,只是我对 Haskell 还不够熟悉。我怎样才能做到这种“Haskell 风格”(一行)?
【问题讨论】:
-
无法重现(即使在修正了拼写错误
rremoveFirst->removeFirst之后)。你确定你复制了你正在尝试的代码完全?特别是,您的原始代码在then分支中是否有p x而不是x?
标签: haskell