首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell:有方法从函数内部推断函数的返回类型吗?

Haskell:有方法从函数内部推断函数的返回类型吗?
EN

Stack Overflow用户
提问于 2014-12-18 13:34:30
回答 1查看 331关注 0票数 6

假设我有以下函数:

代码语言:javascript
复制
import Data.Typeable
import Text.Read (reads)

parse :: (Read b, Typeable b) => String -> IO b
parse msg = case reads msg of
        [(value,"")] -> return value
        _ -> throwIO $ ErrorCall ("could not parse " ++ msg)

它把一根线解析成我想要的任何东西。如果字符串格式错误,它将抛出一个显示消息的异常,该异常无法解析。

我在IO-Monad的do块中使用这个函数,如

代码语言:javascript
复制
(a,b) <- parse msg :: IO (Int,Int)

在另一个地方,比如

代码语言:javascript
复制
s <- parse msg :: IO String

现在,如果我想让异常更详细地报告它无法读取的类型

代码语言:javascript
复制
import Data.Typeable
import Text.Read (reads)

parse :: (Read b, Typeable b) => String -> IO b
parse msg = case reads msg of
        [(value,"")] -> return value
        _ -> throwIO $ ErrorCall ("could not parse " ++ msg ++ " as " ++
                         show ( typeOf something_that_has_type_b))

我怎么弄到有b型的东西?

一个可能的解决办法就是这样做。

代码语言:javascript
复制
import Data.Typeable
import Text.Read (reads)

parse :: (Read b, Typeable b) => b -> String -> IO b
parse dummy msg = case reads msg of
        [(value,"")] -> return value
        _ -> throwIO $ ErrorCall ("could not parse " ++ msg ++ " as " ++
                         show ( typeOf dummy))

并且调用它就像

代码语言:javascript
复制
s <- parse "" msg :: IO String

但这看起来挺傻的。

有方法从函数内部推断函数的返回类型吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-18 13:38:53

您不需要虚拟变量,您可以使用ScopedTypeVariables扩展。

代码语言:javascript
复制
{-# LANGUAGE ScopedTypeVariables #-}

parse :: forall b. (Read b, Typeable b) => String -> IO b
parse msg = case reads msg of
    [(value,"")] -> return value
    _ -> error $ "could not parse " ++ msg ++ " as " ++
                     show (typeOf (undefined :: b))
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27547824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档