簡體   English   中英

lambda 表達式的模式匹配

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

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