[英]About scanl1 in Haskell
函數應返回列表的運行總和。 例如用[1,2,3,5]
調用將返回[1,3,6,11]
。
我寫了這個函數,如下所示:
sumlist' :: [xx]=[xx]
sumlist' []=[]
sumlist' [x]=x
sumlist' xx=scanl1 (+) [xx]
當我在GHcI中運行它時,它表明我做了多個聲明。 那么此功能有什么問題呢?
首先,您想將聲明更改為
sumlist' :: [xx]->[xx]
因為sumlist'接受類型為xx的列表,然后返回類型為xx的列表。
由於我們在對scanl1的調用中使用(+),並且(+)需要Num
類型,因此,我們將需要追溯到sumlist的定義,並告訴我們我們具體采用了Nums列表。
sumlist' :: Num xx=>[xx]->[xx]
scanl1可以處理空列表,因此您所需要做的就是
sumlist' :: Num xx=>[xx]->[xx]
sumlist' xx = scanl1 (+) xx
但是,如果您仍然想嘗試一下代碼,那么仍然需要修復最后兩行:
對於x包含1個元素的情況,您具有:
sumlist' [x] = x
請記住,sumlist'會獲取一個列表並返回一個列表 ,因此只需將列表返回即可!
sumlist' [x] = [x]
對於最后一種情況,如果您選擇一個名為xx的列表,
sumlist' xx=scanl1 (+) [xx]
xx已經是列表,因此GHC會認為[xx]
是列表的列表 ,因此只需刪除方括號
sumlist' xx=scanl1 (+) xx
所以我們修改后的代碼是這樣的:
sumlist' :: Num xx=>[xx]->[xx]
sumlist' []=[]
sumlist' [x]=[x]
sumlist' xx=scanl1 (+) xx
如臨時代表所說,如果您需要向GHCi輸入多行,請使用:load命令。
希望這會有所幫助,並祝您黑客愉快:-)
sumlist' :: [xx]=[xx]
那條線是錯誤的。 ::
之后的部分應該是類型聲明,看起來像[a] -> [a]
。 (是的,看起來像模式/值[xx]
,但不是。)
不要嘗試在GHCi中輸入多行聲明,它會分別對待每條輸入行。 只需將其保存在文件中,然后從GHCi :load
文件即可。
這不是您問題的直接答案,但是使用高階函數定義sumList的更好方法是:
sumList :: (Num a) => [a] -> [a]
sumList = tail . scanl (+) 0
還要注意,盡管您的類型簽名顯然被誤認為=
->
,但它本來是“太多態的”,因為您的函數僅適用於“ Num
類中的某些類型”列表,而不適用於“任何類型的列表”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.