【发布时间】:2020-08-15 05:46:57
【问题描述】:
我正在尝试将这段代码从 Haskell 转换为 SML,这将产生一个高阶函数(众所周知的 foldr)
type List_alg x u = (u, x->u->u)
list_cata :: List_alg x u -> [x] -> u list_cata (a,f) = cata where
cata[] =a
cata (x:l) = f x (cata l)
因此,如果我们想创建一个新函数prod,它将为我们提供列表中所有元素的乘积,我们可以通过以下方式创建:
prod = list_cata (1, (*))
这是我目前所拥有的:
type ('a, 'b) List_alg = 'b * ('a -> 'b -> 'b)
fun list_cata (a, f) List_alg: 'a list -> 'b =
let
fun cata (xs: 'a list) : 'b =
case xs of
[] => a
| x::xs => f x (cata xs)
in
cata
end
val prod = list_cata (1, fn (x,y) => x*y)
当 list_cata 函数编译时,是 prod 给了我错误。到目前为止我得到的错误是:
Error: operator and operand do not agree [overload conflict]
operator domain: [int ty] * ([* ty] * [* ty] -> [int ty] -> [int ty])
operand: [int ty] * ([* ty] * [* ty] -> [* ty])
in expression:
list_cata (1,(fn (<pat>,<pat>) => <exp> * <exp>))
我不太明白这里有什么问题。任何帮助将不胜感激!
【问题讨论】:
-
你写的函数需要一个柯里化函数
f,但你传递的是一个未柯里化的版本。
标签: haskell functional-programming sml fold smlnj