首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写: Vect (S (S (n +m)a -> Vect (S (+n (S )a

如何重写: Vect (S (S (n +m)a -> Vect (S (+n (S )a
EN

Stack Overflow用户
提问于 2018-08-20 00:17:38
回答 1查看 103关注 0票数 1

我被Idris卡住了(再说一次,叹息)。我从第10章的类型驱动开发和Idris一书中做了一个关于合并排序的练习。

代码语言:javascript
复制
import Data.Vect
import Data.Vect.Views

sort2 : Ord a => (l: a) -> (r: a) -> (a, a)
sort2 l r = if l <= r then (l, r) else (r, l)

needHelp :  Vect (S (S (n + m))) a -> Vect (S (plus n (S m))) a
needHelp {n=(S n)} {m=(S m)} (x :: xs) = ?help

vectMerge : Ord a => Vect n a -> Vect m a -> Vect (n + m) a
vectMerge [] ys = ys
vectMerge {n} xs [] = rewrite plusZeroRightNeutral n in xs
vectMerge {n=(S n)} {m=(S m)} (x :: xs) (y :: ys) =
  let (f, s) = sort2 x y in
  needHelp (f :: s :: (vectMerge xs ys))

我已经隔离了needHelp函数,这样您就可以看到我想要实现的重写。我试过这个:

代码语言:javascript
复制
vectMerge : Ord a => Vect n a -> Vect m a -> Vect (n + m) a
vectMerge [] ys = ys
vectMerge {n} xs [] = rewrite plusZeroRightNeutral n in xs
vectMerge {n=(S n)} {m=(S m)} (x :: xs) (y :: ys) =
  let (f, s) = sort2 x y in
  let tail = (rewrite plusSuccRightSucc n m in s :: vectMerge xs ys) in
  f :: tail

但Idris抱怨道:

代码语言:javascript
复制
When checking right hand side of Main.case block in vectMerge with expected type
        Vect (S (plus n (S m))) a

rewriting S (plus n m) to plus n (S m) did not change type letty

我不明白这为什么行不通。非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 01:56:05

rewrite与你当前的目标有关,而不是你试图用来解决目标的术语的wrt (我试图用this answer来说明它)。

因此,这里有一个可能的解决方案:

代码语言:javascript
复制
import Data.Vect

sort2 : Ord a => (l: a) -> (r: a) -> (a, a)
sort2 l r = if l <= r then (l, r) else (r, l)

vectMerge : Ord a => Vect n a -> Vect m a -> Vect (n + m) a
vectMerge [] ys = ys
vectMerge {n} xs [] = rewrite plusZeroRightNeutral n in xs
vectMerge {n=(S n)} {m=(S m)} (x :: xs) (y :: ys) =
  let (f, s) = sort2 x y in
  rewrite sym $ plusSuccRightSucc n m in
  (f :: s :: (vectMerge xs ys))

sym $ plusSuccRightSucc n m中的symrewrite的方向相反。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51919602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档