Функция, вызывающая другую функцию

Допустим, у меня есть две функции SML Ping и Pong. Мой код таков:

val arr=Array.array(10,0)

fun Ping (arr,_,[],_)=true
   |Ping (arr,0,(x::xs),ping_list)=Ping(arr,1,xs,Pong(arr,ping_list,10)) //<-Problem is here
   | Ping (arr,K,(x :: xs),ping_list) =
        (if Array.sub(arr,x)=0
        then
         Array.update(arr, x, Array.sub(arr,x)+1)
        else
          Array.update(arr, x, Array.sub(arr,x)+1);
        if Array.sub(arr,x)-1<1 then Ping (arr,(K-1),xs,(x::ping_list)) else Ping (arr,K,xs,(x::ping_list)))



fun Pong arr [] _ =[]
   |Pong arr (x::xs) min=
   (if Array.sub(arr,x)>=1 
      then  Array.update(arr,x,Array.sub(arr,x)-1)
      else();
   if Array.sub(arr,x)+1>1 
         then if (length xs)<min then Pong arr xs (length xs)
          else Pong arr xs min
   else xs)

Если я вызываю Ping, скажем, с массивом, 3: int, [1,2, 3]: list, [], он дает мне желаемый результат. Таким же образом, если я вызываю Pong с массивом, списком, целым числом, это дает мне вывод, который я хочу. В функции ping, если K = 0, я хочу вызвать функцию pong (которая изменяет массив) и рекурсивно вызвать функцию Ping, но в параметре ping_list есть результат Pong (который представляет собой список). Однако запуск этого дает мне эта ошибка:

stdIn:27.40-27.73 Error: operator and operand do not agree [tycon mismatch]
  operator domain: int array
  operand:         'Z * 'Y * [int ty]
  in expression:
    Pong (arr,ping_list,10)

Я также пытался поместить Ping и Pong внутри локальной сети и вызвать Ping изнутри, но, похоже, это не сработало. Как это можно решить?

Какую версию SML вы используете? Я попытался запустить ваш код, но у него было несколько проблем, не позволяющих мне его запустить, взаимная рекурсия между Ping и Pong и отсутствующие скобки/точки с запятой были самыми большими. Но после исправления синтаксиса программа у меня вроде работает.

nickglazer 07.04.2019 21:05

Я использую v110.85, не могли бы вы опубликовать код, который работает для вас?

user11210665 07.04.2019 21:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
277
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Control.Print.printDepth := 20;

val arr = Array.array(10,0)

fun Ping (arr, _, [], _) = true
   |Ping (arr, 0, (x::xs), ping_list) = Ping(arr, 1, xs, Pong(arr, ping_list, 10))
   |Ping (arr, K, (x :: xs), ping_list) =
        (if Array.sub(arr, x) = 0
        then Array.update(arr, x, Array.sub(arr, x)+1)
        else Array.update(arr, x, Array.sub(arr, x)+1);
        if Array.sub(arr, x)-1 < 1
        then Ping(arr, (K-1), xs, (x::ping_list))
        else Ping(arr, K, xs, (x::ping_list)))
and Pong(arr, [], _) = []
   |Pong(arr, (x::xs), min) =
    (if Array.sub(arr, x) >= 1 
      then (Array.update(arr, x, Array.sub(arr, x)-1); [])
      else [];
    if Array.sub(arr,x) + 1 > 1 
        then if (length xs) < min then Pong(arr, xs, (length xs)) else Pong(arr, xs, min)
   else xs);

val result = Ping(arr, 3, [0, 2, 4], []);
val it = arr;

Выход:

val arr = [|0,0,0,0,0,0,0,0,0,0|] : int array
val Ping = fn : int array * int * int list * int list -> bool
val Pong = fn : int array * int list * int -> int list
val result = true : bool
val it = [|1,0,1,0,1,0,0,0,0,0|] : int array

Проблемы, которые я исправил до запуска:

  • Типы возврата Pong не были согласованы (смешение () и int list)
  • Пинг и Понг не были определены взаимно
  • Смешанное определение карри и без карри / вызовы Pong

Другие вопросы по теме