【发布时间】:2020-07-15 10:13:02
【问题描述】:
在下面的函数中,我在 (S k) 上的 k 的后继上进行模式匹配
vectTake : (n : Nat) -> Vect (n + m) a -> Vect n a
vectTake Z xs = []
vectTake (S k) (x :: xs) = x :: vectTake k xs
如果需要,是否可以在函数体上使用该值?
另一种解决方案是在 k 上匹配并在 body 函数上使用 k 的前身,这样解决同一问题的另一种形式或这种模式匹配提供了我看不到的任何其他优势?
【问题讨论】:
-
我不确定你的意思。您已经在使用
k,如果您稍微更改签名(和功能),您可以使用S k...vectTake (S k) (x :: xs) = (S k) :: vectTake k xs -
也许你的意思是命名模式
vectTake count@(S k) (x :: xs) = count :: vectTake k xs -
@JoelB 感谢您的回答,当我问“是否可以在需要时在函数体上使用该值?”时,他们都解决了我的意思。太好了,你让我想起了命名功能让我试着更好地解释第二个问题,我们可以这样做:
vectTake k (x :: xs) = x :: vectTake (pred k) xs吗?如果是,(S k)中的模式匹配比k有什么优势? ——
标签: functional-programming pattern-matching idris