能否在Idris2的isSingleton类型函数分支中插入打印语句后返回类型?
问题解答
首先明确:不能直接在isSingleton True = Nat这个类型函数分支中插入putStrLn "hello world",原因如下:
类型函数与值操作的边界
isSingleton是类型级函数,它的逻辑在编译阶段执行,作用是根据输入的类型级Bool值返回对应的Type类型(Nat或List Nat)。而putStrLn "hello world"是值层面的IO副作用操作,属于运行时执行的逻辑,两者处于完全不同的执行阶段,类型系统不允许在类型级代码中嵌入值层面的副作用操作。类型不兼容
类型函数的返回值必须是Type类型,但putStrLn "hello world"的类型是IO (),这是一个值类型,和Type完全不匹配。如果强行编写此类代码,Idris2编译器会直接抛出类型错误。替代方案
如果需要实现"先打印字符串,再使用Nat类型"的逻辑,应该把打印逻辑放到值层面的函数中,比如:printThenGetNat : IO Nat printThenGetNat = do putStrLn "hello world" pure 42 -- 返回任意Nat值
内容的提问来源于stack exchange,提问作者user746461
相关产品推荐
相关产品推荐

