【发布时间】:2021-02-23 13:59:47
【问题描述】:
我有两种形式的功能
foo :: Int -> IO String
bar :: Int -> IO Integer
它基本上存在于由(->) Int 和IO 组成的函子中。
现在,有一个类型的函数
baz :: String -> Integer -> Float
我想使用类似的应用语法将其提升到 Int -> IO _ 上下文
foobarbaz :: Int -> IO Float
foobarbaz = baz <$> foo <*> bar
如果我这样做,编译器会对我大喊大叫
Couldn't match type `IO String' with `[Char]'
Expected type: Int -> String
Actual type: Int -> IO String
好像它试图仅将应用程序实例用于(->) Int。
我认为应用函子是组合的,因此我可以将应用实例用于组合函子。我错了吗?还是应该只向编译器提供更多信息?
我也尝试启用TypeApplications 来明确指定我想使用的函子,但我意识到我不能写(->) Int (IO _)。真的有办法吗?
【问题讨论】:
标签: haskell applicative