【发布时间】:2016-01-03 06:57:21
【问题描述】:
我正在尝试在 haskell 中编写一个带有两个参数和一个函数的函数。根据这两个参数,它将执行或不执行给定的功能。问题是给定的函数可以有不同的类型签名。在伪代码中:
functionB:: String -> IO()
functionC:: String -> String -> IO()
functionA :: String -> String ->(???)-> IO()
functionA parm1 parm2 f = if parm1 == parm2
then f
else hPutStrLn "error"
FunctionA 应该能够与函数 C 或 B 一起使用,并且您可以看到 B 和 C 具有不同的类型签名。你能在 Haskell 中做到这一点吗?如果是这样,functionA 的类型签名是什么?
【问题讨论】:
-
这似乎是一个 XY 问题。你不会在 Haskell 中做这样的事情。您要解决的实际问题是什么?
-
您不能编写将
String -> IO()或String -> String -> IO()作为参数的函数。你需要Either (String -> IO()) (String -> String -> IO())。 (但过度依赖IO ()是一个强烈的信号,表明您正在尝试用不同的语言编写程序。) -
hPutStrLn将Handle作为其第一个参数,而不是String。假设你打算使用putStrLn,那么else中的表达式类型为IO (),then中的表达式类型必须相同。因此,如果将hPutStrLn更改为putStrLn,(???)的类型必须为IO (),因此functionB和functionC都不能通过。 -
@molbdnilo,严格来说并非如此。
f :: (String -> a) -> IO ()将接受String -> IO ()或String -> String -> IO ()(以及第一个参数为String类型的任何其他函数)。现在,您是否可以使用该类型制作有用的功能是另一回事!
标签: haskell