2016-11-16 31 views
5

第一個問題,這裏面完全在Haskell這樣的小白,所以請與我是那種:)沒有實例可摺疊從長度引起的拉姆達

我與this哈斯克爾的問題,6號打練習

並最終來到了溶液(或類似的東西,我希望)與此代碼

combinations gr lis = filter clean $ sequence $ replicate gr lis 
where 
    clean string 
     | total > gr = False 
     | otherwise = True 
     where total = sum [ rpt c string | c <- string] 
    rpt chr list = length $ filter (== chr) list 

我喜歡突出的功能是「RPT」,其對一個字符重複的次數部分一個字符串,例如E: 「AABA」 - > [3313](3來自字母a,其中repeates 3次) 「aaccva」 - > [332213]

稍後我試圖使該函數與一個lambda和造成這種地圖:

rpt chr list = map (\chr -> length $ filter (== chr)) list 

,並在第一ghci中告訴我使用FlexibleContext允許這一點,但如果我那麼做它產生:

<interactive>:7:1: 
No instance for (Foldable ((->) [Char])) 
    arising from a use of ‘rpt’ 
In the expression: rpt 'a' string 
In an equation for ‘it’: it = rpt 'a' string 

,在這裏我'卡住了,我有無法理解正在發生的事情......修復此功能需要什麼?

+1

對於初學者來說,這是非常好的結果,你說你是這樣的,你對此有一個訣竅 – luqui

+0

作爲這些情況下的一般建議,當你得到一個令人困惑的錯誤信息時,開始添加類型註釋,說明你認爲類型應該是什麼。這將顯着改善錯誤信息。實際上,爲所有頂級函數提供類型註釋通常是很好的做法,以儘快捕獲這些類型的錯誤。 –

+0

這對初學者很好。一些注意事項:1)考慮'clean string = total <= gr where ...'因爲使用守衛或if-then-else返回true/false看起來比它需要的更復雜2)你的組合算法正確但並不理想:您會生成很多候選人,並且您需要稍後進行篩選。考慮一下:你可以通過跳過'x'(並且從'xs'中取所有k個元素)或者選擇'x'(然後從'xs'中只取k-1個元素)從'x: 。 – chi

回答

5

你可能正打算過濾過list,所以OO使你的代碼的工作,你還需要添加listfilter參數:

rpt chr list = map (\chr -> length $ filter (== chr) list) list 

作爲一個初學者,我會忽略的FlexibleContexts GHCI的建議。它往往不會最終產生類似你所遇到的錯誤信息(或其他令人困惑的東西,如No instance for (Num (Int -> Bool)))。

+0

建議:他實際上想要的解決方案是在映射函數的末尾包含'list'(如'map(\ chr - > length $ filter(== chr)list)list')。你的代碼產生一個函數列表;我產生一個數字列表。 –

+0

@DanielWagner我認爲你是對的。我會相應地修改解決方案。 – Alec

+0

哇這樣簡單的解決方案...謝謝@Alec你幫了我很多! – iPizarro12