所以我正在尝试创建一个辅助函数来执行其他操作,但我甚至无法通过辅助函数,因为我一直收到此错误:
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
答案 0 :(得分:2)
建议您为每个顶级函数添加类型声明。让我们按照类型演绎系统在这里尝试解决这个问题时所做的事情。
问题不在于lowers
,它以[Char]
为参数并返回Int
。
freqsHelper x
声明有一个参数x,当我们试图找出它时,我们将其称为a
。我们将调用返回类型b
。因此,freqsHelper
是a -> b
类型的函数。
它也等于freqs (x (lowers x))
。因此,类型为x
的{{1}}必须是一个以a
为结果的函数。我们知道lowers
是lowers
,因此[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
甚至应该 的内容感到困惑,所以它放弃了。
也许您打算将x
和lowers x
作为两个单独的参数传递?在这种情况下,你想要
freqs x (lowers x)
通过在x (lowers x)
周围添加括号,您可以让编译器认为x
是函数您希望调用,{{1作为参数。我怀疑你是不是想这样做。
作为旁注,如果在已定义的每个函数上添加类型签名,则可以从类型检查器获得关于哪个位实际上是错误的更清楚的指示。 (实际上,类型检查器可以看到类型没有对齐,但实际上无法确定类型偏离您的意图 - 因为它无法读懂您的想法以了解您的意图......)