2017-10-06 153 views
2

因此,我試圖創建一個輔助函數來執行其他操作,但我甚至無法獲取過去幫助功能,因爲我不斷收到此錯誤:無法與實際類型'Int - > [t - > t1]'匹配預期類型'[Char]'

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 
+1

freq打算做什麼? – Carbon

+0

像Davislor和MathematicalOrchid我建議你爲將來編寫的每個函數編寫類型聲明。它最終爲您節省了大量時間,因爲編譯器可以告訴您早期出錯的位置。類型系統是Haskell中最好的一個,所以你應該使用它來獲得你的優勢。如果你必須做一些類型驅動的編程,編寫類型聲明也可以幫助你。使用'InstanceSigs'擴展名,您還可以在任何類型的類中爲您的函數編寫類型聲明。 –

回答

2

你最好建議爲每個頂級函數添加類型聲明。讓我們來看看類型扣除系統在嘗試解決這個問題時在做什麼。

問題不在於lowers,它以[Char]爲參數並返回Int

freqsHelper x聲明有一個參數x,在我們試圖找出它的時候我們會調用a。我們將致電返回類型b。所以,freqsHelper是類型a -> b的函數。

它也等於freqs (x (lowers x))。因此,x(其型號爲a)必須是以lowers的結果作爲其參數的函數。我們知道lowers[Char] -> Int,因此a必須是Int -> t1類型的函數,其中t1是我們需要從freqs推斷的某種類型。但是,x也作爲參數lowers傳遞。哪一個期望[Char],而不是一個參數的函數。所以我們已經有了一個矛盾。

所以,你的不匹配。在freqsHelper的定義中,您在Haskell需要字符串的上下文中使用x,但在x必須是某種功能的上下文中也是如此。我很確定在freqs中也有一個bug,因爲它只用一個參數調用兩個數值參數的函數。

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:

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 
0
freqsHelper x = freqs (x (lowers x)) 

我們來分解一下。

lowers x 

你叫lowersx作爲輸入,所以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功能呼叫,與lowers x作爲參數。我懷疑你打算這麼做。作爲一個方面說明,如果你在每個你定義的函數上添加了類型簽名,你可能會從類型檢查器得到一個更清楚的指示,說明哪個位實際上是錯誤的。 (事實上​​,類型檢查器可以看到類型不對齊,但實際上不能確定類型偏離了你想要的類型,因爲它無法讀懂你的想法以知道你的意圖......)

相關問題