无法将预期类型'[Char]'与实际类型'Int - >匹配[t - > T1]”

时间:2017-10-06 02:16:38

标签: haskell

所以我正在尝试创建一个辅助函数来执行其他操作,但我甚至无法通过辅助函数,因为我一直收到此错误:

Couldn't match expected type ‘[Char]’ with actual type ‘Int -> [t -> t1]’
freqsHelper x = freqs (x (lowers x))
                                 ^

降低(x)导致问题。这是我的代码:

lowers [] = 0
lowers (x:xs) 
    | isLower x == True = 1 + lowers xs
    | otherwise = lowers xs

count _ [] = 0
count x (y:ys)
    | x == y = 1 + count x ys
    | otherwise = count x ys

percent x y = x/y*100

freqsHelper x = freqs (x (lowers x))

freqs (x:xs) y = percent ((count (x (x:xs))) y) : freqs xs y

3 个答案:

答案 0 :(得分:2)

建议您为每个顶级函数添加类型声明。让我们按照类型演绎系统在这里尝试解决这个问题时所做的事情。

问题不在于lowers,它以[Char]为参数并返回Int

freqsHelper x声明有一个参数x,当我们试图找出它时,我们将其称为a。我们将调用返回类型b。因此,freqsHelpera -> b类型的函数。

它也等于freqs (x (lowers x))。因此,类型为x的{​​{1}}必须是一个以a为结果的函数。我们知道lowerslowers,因此[Char] -> Int必须是a类型的函数,其中Int -> t1是我们需要从{{{{}}推导出来的某种类型1}}。但是,t1也作为freqs的参数传递。期望x,而不是具有一个参数的函数。所以我们已经有了矛盾。

所以,这是你的不匹配。在lowers的定义中,您在Haskell期望字符串的上下文中使用[Char],但在freqsHelper必须是某种函数的上下文中也是如此。我很确定x中也存在一个错误,因为它只调用两个带有一个参数的数字参数的函数。

答案 1 :(得分:0)

啊,我想我知道你在做什么。你很亲密有几件事 - 如果你要做分工,你应该做一个从积分中取回某种分数。

percent :: (Fractional a) => Int -> Int -> a
percent x y = (fromIntegral x / fromIntegral y) * 100

我认为你的频率试图获得列表中某些内容的频率,在这种情况下你需要一个基本案例:

freqs [] y = []
freqs (x:xs) y = percent (count x y) (length y) : freqs xs y 

我想你可以从这里找出其余部分。

一些样式提示 - 您可以将地图用于频率:

freqs' x y = map (\a -> percent (count a y) $ length y) x

编译器可能会为你做,但是你可以明确地调出长度y:

freqs' x y = map (\a -> percent (count a y) len) x
    where len = length y

答案 2 :(得分:0)

freqsHelper x = freqs (x (lowers x))

让我们打破这一点。

lowers x

您以lowers作为输入来致电x,因此x必须是字符串。

x (lowers x)

但是您将x称为函数,并将lowers的结果作为输入传递给它。因此x必须是以Int为输入的函数。 (这听起来像个错误......)

freqs (x (lowers x))

您使用调用freqs函数的输出调用x ...所以x必须返回某种列表?

此时,类型检查器对于x甚至应该 的内容感到困惑,所以它放弃了。

也许您打算将xlowers x作为两个单独的参数传递?在这种情况下,你想要

freqs x (lowers x)

通过在x (lowers x)周围添加括号,您可以让编译器认为x函数您希望调用,{{1作为参数。我怀疑你是不是想这样做。

作为旁注,如果在已定义的每个函数上添加类型签名,则可以从类型检查器获得关于哪个位实际上是错误的更清楚的指示。 (实际上,类型检查器可以看到类型没有对齐,但实际上无法确定类型偏离您的意图 - 因为它无法读懂您的想法以了解您的意图......)