簡體   English   中英

關於Haskell中的scanl1

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM