我试图以递归方式找到谓词为true的第i个正整数。我需要为每个功能保持一般性。
ithTrueValue :: (Int -> Bool) -> Int-> Int
ithTrueValue func i
| i < 1 = error "Integer MUST BE greater than 0"
| ithTrueValue func i = 1 + ithTrueValue(func i-1 )
| otherwise = ithTrueValue(func i-1)
I get a type error:
ERROR file:.\new 10.hs:6 - Type error in guard
*** Term : ithTrueValue func i
*** Type : Int
*** Does not match : Bool
答案 0 :(得分:5)
问题是ithTrueValue func i
不是布尔值,它是一个整数。我认为这里有4个案例需要处理,
i
是一个疯狂的值,如-1或类似的i
它是真的。考虑到这一点,让我们稍微重构你的代码
ithTrueValue f i = go 0 f i
所以我们正在使用这个名为go
的辅助函数,它将计算整数并跟踪我们所处的整数
where go _ _ i | i <= 0 = error "i must be a positive integer" -- case 1.
go curr f i | f curr = if i == 1
then curr -- case 4.
else go (curr + 1) f (i - 1) -- case 2.
| otherwise = ??? -- case 3.
其中???
是谓词为false的情况。我会留给你弄清楚在这种情况下要做什么。
现在这个有效,但它非常低级别。显式递归并不是编写这种sorta内容的最好方法。更令人愉快的是依靠更高阶的功能,特别是
filter :: (a -> Bool) -> [a] -> [a]
因此,这将在列表中运行,并将所有值保留在谓词为真的位置
ithTrueValue i f = ??? filter f [0..]
其中???
获取列表的ith
值。为此,我们使用
(!!) :: [a] -> Int -> a
只选择一个索引
ithTrueValue i f = filter f [0..] !! i
答案 1 :(得分:0)
您的错误在于此行:
| ithTrueValue func i = 1 + ithTrueValue(func i-1 )
^^^^^^^^^^^^^^^^^^^^^^^^^
iTruthValue
有2个参数,但由于parens你只用一个参数调用它。
你可能想写一些类似的东西:
| ithTrueValue func i = 1 + ithTrueValue func (i-1)