Haskell类型错误(Int - > Bool函数参数)

时间:2014-01-21 03:51:12

标签: haskell

我试图以递归方式找到谓词为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

2 个答案:

答案 0 :(得分:5)

问题是ithTrueValue func i不是布尔值,它是一个整数。我认为这里有4个案例需要处理,

  1. i是一个疯狂的值,如-1或类似的
  2. 谓词在当前整数时为真,
  3. 谓词在当前整数
  4. 时为false
  5. 谓词是真的,这是i它是真的。
  6. 考虑到这一点,让我们稍微重构你的代码

     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)