[英]Pattern matching for lambda expressions
21 --Primitive recursion constructor
22 pr :: ([Int] -> Int) -> ([Int] -> Int) -> ([Int] -> Int)
23 pr f g = \xs 0 -> f xs
24 pr f g = \xs (y+1) -> g xs y ((pr f g) xs y)
我希望這個函數創建的函數對不同的輸入有不同的作用,這樣它就可以創建一個遞歸函數。 正如預期的那樣,上面的代碼不起作用。 我如何做模式匹配之類的事情,但對於它創建的功能?
謝謝
pr f g = \xs y' -> case y' of 0 -> f xs
(y+1) -> g xs y ((pr f g) xs y)
或者干脆
pr f g xs 0 = f xs
pr f g xs (y+1) = g xs y ((pr f g) xs y)
(請記住, fab = ...
基本上是fa = \\b -> ...
的快捷方式fa = \\b -> ...
這是f = \\a -> \\b -> ...
的快捷方式。)
請注意,不推薦使用n + 1模式,並且為pr指定的類型與您的(和我的)定義不匹配。
具體來說,根據你的類型,函數采用[Int] -> Int
(f),然后采用另一個[Int] -> Int
(g)的函數,然后采用[Int]
(xs)然后返回的函數國際 但是你用三個參數調用g並且你返回的最后一個函數有兩個參數,所以你想要像([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int
。
另一種解決方案是使用 lenguaje 擴展LambdaCase
:
{-# LANGUAGE LambdaCase #-}
pr f g = \xs -> \case
0 -> f xs
(y+1) -> g xs y ((pr f g) xs y)
在這些情況下,您有兩個使用兩個\\
因為在\\case
您只能有一個參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.