Как использовать "IO действия" с пониманием списка или картографом в Rascal? - PullRequest
0 голосов
/ 07 февраля 2019

Мне было интересно, что действия ввода-вывода (например, println) будут возвращать значение типа void, и тогда мы сможем использовать эти действия в понимании списка или в качестве аргумента функции mapper.Однако, когда я пытаюсь

rascal> import IO;
rascal> import List; 
rascal> [println(x) | x <- [1,2,3]];

, я получаю исключение нулевого указателя (часть стека трассировки ниже).То же самое происходит, когда я пытаюсь

rascal> mapper([1,2,3], println);
1
java.lang.NullPointerException(internal error) at $root$(|main://$root$|)
java.lang.NullPointerException
    at io.usethesource.vallang.impl.fast.ListWriter.updateType(ListWriter.java:76)
    at io.usethesource.vallang.impl.fast.ListWriter.append(ListWriter.java:84)
    at org.rascalmpl.semantics.dynamic.ListComprehensionWriter.append(ListComprehensionWriter.java:38)

Конечно, я не ожидал такого поведения, как отображение действия ввода-вывода в список в Haskell, хотя я не понимаю причину этого исключения нулевого указателя в Rascal.

1 Ответ

0 голосов
/ 07 февраля 2019

Причина нулевого указателя в том, что printf является пустой функцией.В текущей реализации это реализовано как указатель null.Вы можете использовать вместо

for(x <- [1,2,3]) println(x);
...