我開始學習 Haskell。我找到了一個代碼,每隔幾個字符(我們用引數設定),插入一個給定的字符(也是一個引數)。但我無法弄清楚它是如何作業的。
func1 :: [a] -> Int
func1 [] = 0
func1 (_:xs) = 1 func1 xs
func2 :: Int -> [a] -> [a]
func2 _ [] = []
func2 n xs@(_:xs')
| n > 0 = func2 (n-1) xs'
| otherwise = xs
func3 :: [a] -> Int -> a -> [a]
func3 xs 0 y = xs
func3 [] n y = []
func3 xs n y
| func1 xs < n = xs
| otherwise = n `take` xs [y] func3 (drop n xs) n y
main :: IO ()
main = do
print(func3 "1234567" 2 '@')
我明白什么,例如,這個func1 :: [a] -> Int是做什么的,但是這部分代碼是什么,我不明白?
func2 n xs@(_:xs')
| n > 0 = func2 (n-1) xs'
| otherwise = xs
還是這個?
func3 xs 0 y = xs
func3 [] n y = []
func3 xs n y
| func1 xs < n = xs
| otherwise = n `take` xs [y] func3 (drop n xs) n y
你能向我解釋一下嗎?謝謝
uj5u.com熱心網友回復:
我將嘗試一一介紹這些功能。
func1 xs計算 的長度xs。[]有長度0,并且 的長度x : xs比 的長度多一xs。
func2 n xs@(_:xs')沒有被任何其他函式呼叫,但我將嘗試解釋如果呼叫它會做什么。這種模式xs@(_:xs')可能看起來不尋常,所以讓我們分解一下。xs@pat將變數系結xs到模式pat。在這種情況下,模式是_:xs。下劃線匹配任何值并丟棄它。xs'匹配任何串列。如果您呼叫func2 3 [1, 2],則將匹配此模式。在函式的作用域內,xs將等于[1, 2]和xs'將等于[2]。如果n > 0,則func2呼叫自身, wherexs已被 的尾部替換xs,并且n已被替換為n - 1。這一直持續到n = 0,此時xs才保留。所以,func2 n xs本質上與drop n xs. 至少只要length xs >= n.
正如您所說,在 的每個位置func3插入。有幾種情況:
是一個沒有明顯行為的邊緣情況,所以什么都不做。如果,則沒有th 位置,因此再次不執行任何操作。最后一個模式使用警衛區分兩種情況。這是必要的,因為沒有“至少長度串列”的模式,除非在編譯時已知某些常量。在第一種情況下,(使用 計算)的長度小于。同樣,由于沒有 position ,因此沒有可插入的內容。第二個守衛是魔法發生的地方。從字面上看只是ynxsn = 0func3xs = []nxsfunc3nnxsfunc1nnotherwiseTrue因此,這是一個“包羅萬象”的守衛。結果可以通過以下程序來描述:首先我們取 的第一個n元素xs。然后我們附加 ( ) 單元素串列[y]。然后我們將應用的結果附加func2到剩余的串列中。
這是我第一次在 SO 上發布答案,所以請隨時詢問是否有不清楚的地方!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/367045.html
標籤:哈斯克尔
