我正在玩haskell-distributed(Cloud Haskell),我无法使用返回类型使用类型约束(必须为... -> Process ()
)。
为了简化上下文(并给出一个可重现的例子),让
-- Request / Response
data ReqRes a b = Req a | Res b deriving (Read, Show)
和一个通用函数映射通用进程
compute :: (Read a, Read b, Show a, Show b) => (a -> b) -> IO ()
compute f = do
req <- readLn
case req of
Res _ -> error "Req expected"
Req a -> print $ Res $ f a
这无法编译,因为req <- readLn
和Res $ f a
无法分别推断b
类型和a
类型。
我的解决方案是使用const
到“link / constraint”的变体这两个表达式:
linkType :: a -> a -> a
linkType = flip const
compute' :: (Read a, Read b, Show a, Show b) => (a -> b) -> IO ()
compute' f = do
req <-readLn
case req of
Res _ -> error "Req expected"
Req a -> print $ linkType req $ Res $ f a
现在编译并正常工作
> compute' (2 *)
Req 12
Res 24
> compute' (show :: Int -> String)
Req 12
Res "12"
但我希望知道做这种事情的正确方法。
谢谢!