我正在解決99個Haskell探測器。我已經成功解決了第21號問題,並且當我打開solution page時,提出了以下解決方案:一個有趣的模式
將給定位置的元素插入列表中。
insertAt :: a -> [a] -> Int -> [a]
insertAt x xs (n+1) = let (ys,zs) = split xs n in ys++x:zs
我找到的模式(n + 1)
有趣,因爲它似乎是對的insertAt
基於1的參數轉換成基於0的split
參數(從前面練習它的功能,本質上是相同splitAt
一種優雅的方式)。問題是,GHC並沒有發現這種模式是優雅的,其實它說:圖案
解析錯誤:N + 1
我不認爲這是誰寫的答案的傢伙是愚蠢的,我想知道這種模式在Haskell中是否合法,如果是的話,如何解決這個問題。
儘管我認爲'n + k'-patterns確實具有一定的吸引力,但是在基於1和基於零的表示之間_converting_會使IMO從未成爲合適的用例。它們旨在遞歸地「解構」數字。 - FWIW,'insertAt'無論如何都應該是零,不是嗎? – leftaroundabout 2014-09-11 15:05:28
@leftaroundabout,'insertAt'根據給定的例子應該是1:'insertAt'X'「abcd」2' - >'「aXbcd」'。 – Mark 2014-09-11 15:27:47
是的,我的意思是,它應該被指定爲0,因爲所有的Haskell標準列表函數都是[[rightly](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831的.html))。 – leftaroundabout 2014-09-11 15:40:52