如何在 Rascal 中将 "IO actions" 与列表理解或映射器一起使用?
how to use "IO actions" with list comprehension or mapper in Rascal?
我想知道 IO 操作(如 println)会 return 类型为 void 的值,然后我们可以在列表理解中使用这些操作或作为映射器函数的参数。然而,当我尝试
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)
当然,我并没有真正期待将 IO 操作映射到 Haskell 中的列表的行为,尽管我不明白 Rascal 中出现此空指针异常的原因。
空指针的原因是printf
是一个void函数。在当前实现中,这是作为 null
指针实现的。你可以改用
for(x <- [1,2,3]) println(x);
我想知道 IO 操作(如 println)会 return 类型为 void 的值,然后我们可以在列表理解中使用这些操作或作为映射器函数的参数。然而,当我尝试
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)
当然,我并没有真正期待将 IO 操作映射到 Haskell 中的列表的行为,尽管我不明白 Rascal 中出现此空指针异常的原因。
空指针的原因是printf
是一个void函数。在当前实现中,这是作为 null
指针实现的。你可以改用
for(x <- [1,2,3]) println(x);