功能“返回”在我的代码中做了什么?

时间:2014-12-24 14:11:09

标签: haskell io return

类型:

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)类型检查的方式吗?

2 个答案:

答案 0 :(得分:6)

您的代码中没有进行模式匹配,因此我认为您的意思是"键入检查"。

return . f是一个接受参数x并计算为return (f x)的函数。 return类型为Monad m => a -> m af类型为a -> a。因此,我们知道f x的类型与xreturn (f x)的类型相同,然后类型为m a,其中ax的类型{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}}