我得到這個函式來合并 Haskell 中的兩個串列:
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys
但我想要這個功能merge :: ([a],[a]) -> [a],我該如何進行更改?
uj5u.com熱心網友回復:
您可以重用該merge函式以使其適用于串列元組,如下所示:
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys
mergeTuples :: ([a], [a]) -> [a]
mergeTuples (xs, ys) = merge xs ys
uj5u.com熱心網友回復:
有一個uncurry函式,在這種情況下會很有幫助。參考:
uncurry 將柯里化函式轉換為成對函式。
在這種情況下,我們可以用它來獲得merge'來自merge:
merge' :: ([a], [a]) -> [a]
merge' = uncurry merge
merge' ([1],[2]) == [1, 2] --> True
uj5u.com熱心網友回復:
你改變
merge1 :: [a] -> [a] -> [a]
merge1 xs [] = xs
merge1 [] ys = ys
merge1 (x:xs) (y:ys) = x : y : merge1 xs ys
到
merge2 :: ([a], [a]) -> [a]
merge2 ( xs, [] ) = xs
merge2 ( [], ys ) = ys
merge2 (x:xs, y:ys) = x : y : merge2 (xs, ys)
merge1被稱為merge2“柯里化”函式,也稱為“非柯里化”。
通過在呼叫給定函式時根據需要打包/解包引數,函式curry和uncurry在兩種形式之間切換:
curry f x y = f (x,y)
uncurry g (x,y) = g x y
因此merge1 = curry merge2and merge2 = uncurry merge1,但您必須實際定義至少其中之一來實作實際功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387015.html
上一篇:評估擴展歐幾里得演算法的實作
