code: func Foldr(f, init, xs interface{}) interface{} {
  	chk := ty.Check(
  		new(func(func(ty.A, ty.B) ty.B, ty.B, []ty.A) ty.B),
  		f, init, xs)
  	vf, vinit, vxs, tb := chk.Args[0], chk.Args[1], chk.Args[2], chk.Returns[0]
  
  	xsLen := vxs.Len()
  	vb := zeroValue(tb)
  	vb.Set(vinit)
  	if xsLen == 0 {
  		return vb.Interface()
  	}
  
  	vb.Set(call1(vf, vxs.Index(xsLen-1), vb))
  	for i := xsLen - 2; i >= 0; i-- {
  		vb.Set(call1(vf, vxs.Index(i), vb))
  	}
  	return vb.Interface()
  }
docs: // Foldr has a parametric type:
  //
  //	func Foldr(f func(A, B) B, init B, xs []A) B
  //
  // Foldr reduces a list of A to a single element B using a right fold with
  // an initial value `init`.