Как вы вызываете простую функцию с помощью модуля в ReScript / ReasonML?

Скажем, у меня есть незатейливая функция, например:

let echo(. a) = a;

Я могу назвать эту функцию прекрасной с большинством литералов, например:

echo(. 1)
echo(. "Hello")

но когда я пытаюсь вызвать его с помощью void, я получаю сообщение об ошибке:

echo(. ()) //This function has arity1 but was expected arity0

В качестве обходного пути я могу сделать следующее:

let myArg = ()
echo(. myArg)

Есть ли способ этого избежать?


person namesis    schedule 29.12.2020    source источник
comment
Нет - это рекомендуемый способ.   -  person Yawar    schedule 30.12.2020
comment
Привет @Yawar, где это рекомендуется?   -  person namesis    schedule 31.12.2020


Ответы (3)


Мне тоже нравится эта версия:

echo(. ignore())

таким образом мне не нужен обходной путь фиктивного значения

Изменить: эта версия теперь также является частью документации: https://rescript-lang.org/docs/manual/latest/function#uncurried-function

person ryyppy    schedule 03.01.2021

Похоже, вы пытаетесь вызвать некаррированную функцию, которая принимает один параметр без аргументов, потому что это то, что () означает правильно. Единственная причина, по которой он работает с echo(. myArg), заключается в том, что в этом случае компилятор объявляет неинициализированную переменную с именем myArg и передает ее в echo. РЕДАКТИРОВАТЬ: вы можете посмотреть, что я имею в виду, в здесь, на игровой площадке ".

let echo = (. a) => a;


let k =() => echo(. "String")
let myArg = ()
let s =() => echo (. myArg)

генерирует

// Generated by ReScript, PLEASE EDIT WITH CARE
'use strict';


function echo(a) {
  return a;
}

function k(param) {
  return echo("String");
}

function s(param) {
  return echo(undefined);
}

var myArg;

exports.echo = echo;
exports.k = k;
exports.myArg = myArg;
exports.s = s;
/* No side effect */

person masoodahm    schedule 29.12.2020
comment
Я не думаю, что вызов функции с модулем - это то же самое, что вызов функции без аргументов: () - единственный литерал типа unit, и я ожидал бы, что () будет допустимым аргументом для функции с подписью 'a -> 'a. Например, в OCaml я могу написать любую из следующих функций: let f a = a и let g(a) = a, и я могу вызвать их с помощью литерала (). Обе функции вернут unit. Действительно, даже в рескрипте я могу определить функцию let f (a) => a;, и f(()) вернет единицу. Вопрос в том, почему я не могу сделать то же самое, когда функция не спешит - person namesis; 31.12.2020

Судя по рескрипту, это известная проблема. См .: https://github.com/rescript-lang/rescript-compiler/issues/3429

person namesis    schedule 31.12.2020