类型:
data Command a = Command String (a -> IO a)
功能
iofunc :: String -> (a -> IO a) -> Command a
iofunc = Command
func :: String -> (a -> a) -> Command a
func s f = iofunc s (return . f)
有人可以解释(return . f)
(a -> IO a)
类型检查的方式吗?
答案 0 :(得分:6)
您的代码中没有进行模式匹配,因此我认为您的意思是"键入检查"。
return . f
是一个接受参数x
并计算为return (f x)
的函数。 return
类型为Monad m => a -> m a
,f
类型为a -> a
。因此,我们知道f x
的类型与x
和return (f x)
的类型相同,然后类型为m a
,其中a
是x
的类型{1}}和m
是一个monad。换句话说,return . f
的类型为Monad m => a -> m a
,就像return
本身的类型一样。
iofunc
的第二个参数所需的类型是a -> IO a
。由于IO
是monad,因此符合Monad m => a -> m a
类型,因此return . f
具有要作为iofunc
的第二个参数传递的正确类型。因此代码类型检查。
答案 1 :(得分:2)
我不知道“模式匹配”是什么意思,但在这种情况下,return :: a -> IO a
。请注意f :: a -> a
通过将结果线程化到return
(或用return
撰写f
,如果您愿意)我们从a -> a
转到a -> IO a
{1}}