我正在尝试用Haskell翻译这段描述列表变形的代码,但是不能很好地工作。
最后三行应该生成一个函数count,给定一个int,它将生成一个int列表n,n-1,...,1
Haskell代码:
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)到目前为止,我所拥有的:
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我得到以下错误:
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。
发布于 2020-05-08 04:20:14
正如您在注释中提到的,类型参数混淆了。为了进行比较,稍微重命名一下:
type List_coalg a b = a -> Either () (b, a) -- (b, a)type ('a, 'b) List_coalg = 'a -> (unit, 'a*'b) Either (* ('a * 'b) *)这会导致该对上的模式匹配后出现不匹配:
Right (x, l) -> x : ana l
-- x :: b
-- l :: a Right (x, l) => x :: ana l
(* x : 'a *)
(* l : 'b *)https://stackoverflow.com/questions/61663914
复制相似问题