为了简单起见,我想说你可能想要这个:
fun listAdd : (int * int) list -> int list
现在,我将其简单地定义为 unzip 函数的抽象:
fun listAdd ls :
case ls of
[] => 0
| (x,y) :: ls' => (x + y) + (listAdd ls')
我认为拿两个单独的清单是没有意义的。只需获取一个包含整数乘积的列表。如果你必须构建它,你可以调用 zip 函数:
fun zip xs ys :
case xs, ys of
[], [] => []
| xs, _ => []
| _, ys => []
| x::xs', y::ys' => (x,y) :: (zip xs' ys')
一般来说,如果你真的想要,你可以编写一个更抽象的通用类型函数:
fun absProdList : ((`a * `b) -> `c) -> (`a * `b) list -> `c list
这个功能很简单:
fun absProdList f ls =
case l of
[] => []
| (x,y) :: ls' => (f (x,y)) :: (absProdList f ls')
这个函数是addList
你提到的函数的超类型。只需定义一个匿名函数来重新创建您的addList
as :
fun addList' ls =
absProdList (fn (x,y) => x + y) ls
如您所见,定义泛型类型函数可以通过适当组合以下方式对作为通用类型替换的函数进行特定调用更容易和更优雅:Currying、高阶函数和匿名函数。