如何在两个分离的表达式之间调和/约束类型

时间:2016-03-10 21:15:25

标签: haskell type-constraints

我正在玩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 <- readLnRes $ 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"

但我希望知道做这种事情的正确方法。

谢谢!

0 个答案:

没有答案