首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表余代数从Haskell到SML的代码转换

列表余代数从Haskell到SML的代码转换
EN

Stack Overflow用户
提问于 2020-05-08 01:22:37
回答 1查看 65关注 0票数 0

我正在尝试用Haskell翻译这段描述列表变形的代码,但是不能很好地工作。

最后三行应该生成一个函数count,给定一个int,它将生成一个int列表n,n-1,...,1

Haskell代码:

代码语言:javascript
复制
data Either a b = Left a | Right b

type List_coalg u x = u -> Either () (x, u)

list ana :: List_coalg u x -> u -> [x]
list_ana a = ana where
  ana u = case a u of 
    Left _ -> []
    Right (x, l) -> x : ana l

count = list_ana destruct_count
destruct_count 0 = Left ()
destruct_count n = Right (n, n-1)

到目前为止,我所拥有的:

代码语言:javascript
复制
type ('a, 'b) List_coalg = 'a -> (unit, 'a*'b) Either

fun list_ana (f : ('a, 'b) List_coalg) : 'a -> 'b list = 
  let
    fun ana a : 'b list = 
      case f a of
        Left () => []
      | Right (x, l) => x :: ana l
  in
    ana
  end

fun destruct_count 0 = Left ()
  | destruct_count n = Right (n, n-1)

val count = list_ana destruct_count

我得到以下错误:

代码语言:javascript
复制
catamorphism.sml:22.7-24.35 Error: case object and rules do not agree [UBOUND match]
  rule domain: (unit,'b * 'a) Either
  object: (unit,'a * 'b) Either
  in expression:
    (case (f a)
      of Left () => nil
       | Right (x,l) => x :: ana l)

不确定如何解决这个问题,因为我不是超级精通SML。

EN

回答 1

Stack Overflow用户

发布于 2020-05-08 04:20:14

正如您在注释中提到的,类型参数混淆了。为了进行比较,稍微重命名一下:

代码语言:javascript
复制
type List_coalg a b = a -> Either () (b, a)            --  (b, a)
代码语言:javascript
复制
type ('a, 'b) List_coalg = 'a -> (unit, 'a*'b) Either  (*  ('a * 'b)  *)

这会导致该对上的模式匹配后出现不匹配:

代码语言:javascript
复制
    Right (x, l) -> x : ana l
    -- x :: b
    -- l :: a
代码语言:javascript
复制
    Right (x, l) => x :: ana l
    (* x : 'a *)
    (* l : 'b *)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61663914

复制
相关文章

相似问题

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