免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5911 | 回复: 12
打印 上一主题 下一主题

对haskell的类型系统,还有一个困惑。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-30 14:57 |只看该作者 |倒序浏览
haskell是静态类型,所以会有这样一个问题
class A t where
  funA :: t -> IO ()
instance A W where
  funA w = do
    bluh w
    return ()
...
wList :: (A a) => [a]
...
main = do
  mapM_ (funA) wList
最后一行编译无法通过。
怎么办?

[ 本帖最后由 Magicloud 于 2009-6-30 15:35 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-06-30 15:48 |只看该作者
原帖由 Magicloud 于 2009-6-30 14:57 发表
haskell是静态类型,所以会有这样一个问题
class A t where
  funA :: t -> IO ()
instance A W where
  funA w = do
    bluh w
    return ()
...
wList :: (A -> a) => [a]
...
main = do
  mapM_ (funA) wList
最后一行编译无法通过。

出了什么错误?给个完整的例子看看。

论坛徽章:
0
3 [报告]
发表于 2009-07-01 10:27 |只看该作者
基本代码就是类似的了,但A的instance有多个。当wList可能返回[]时,编译不通过。错误是funA不能确定参数类型(这时候mapM_根本不会执行呀!)。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-07-01 12:01 |只看该作者
原帖由 Magicloud 于 2009-7-1 10:27 发表
基本代码就是类似的了,但A的instance有多个。当wList可能返回[]时,编译不通过。

我把你顶楼的代码补全后,可以编译通过。
错误是funA不能确定参数类型(这时候mapM_根本不会执行呀!)。

完整的代码和编译错误信息,直接拷贝粘贴。

论坛徽章:
0
5 [报告]
发表于 2009-07-01 15:44 |只看该作者
Main.hs:28:40:
    Ambiguous type variable `t' in the constraint:
      `W.Widget t'
        arising from a use of `W.widgetRun' at Main.hs:28:40-57
    Probable fix: add a type signature that fixes these type variable(s)
---
25 main = do
26   prs <- newEmptyMVar
27   prs_ <- foldM (\prs_ (x, y, widget) -> do
28                    pid <- forkProcess $ W.widgetRun widget
29                    return $ M.insert pid (x, y, fst $ W.widgetNew widget, snd $ W.widgetNew widget) prs_
30                 ) M.empty widgetList
...
84 widgetList :: (W.Widget w) => [(Integer, Integer, w)]
85 widgetList = []
...
1 module Widget where
2
3 class Widget w where
4   widgetNew :: w -> (Integer, Integer)
5   widgetRun :: w -> IO ()

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-07-01 17:35 |只看该作者
原帖由 Magicloud 于 2009-7-1 15:44 发表
27   prs_ <- foldM (\prs_ (x, y, widget) -> do
28                    pid <- forkProcess $ W.widgetRun widget
29                    return $ M.insert pid (x, y, fst $ W.widgetNew widget, snd $ W.widgetNew widget) prs_
30                 ) M.empty widgetList
...
84 widgetList :: (W.Widget w) => [(Integer, Integer, w)]
85 widgetList = []

在 widgetList 的类型声明中,w 需要更多的限定。

论坛徽章:
0
7 [报告]
发表于 2009-07-02 14:28 |只看该作者
原帖由 MMMIX 于 2009-7-1 17:35 发表

在 widgetList 的类型声明中,w 需要更多的限定。

那就郁闷了……想用class表现几个data的共性,怎么办呢?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2009-07-02 16:02 |只看该作者
原帖由 Magicloud 于 2009-7-2 14:28 发表

那就郁闷了……想用class表现几个data的共性,怎么办呢?

看不到完整的代码,就不可能知道问题出在什么地方。

论坛徽章:
0
9 [报告]
发表于 2009-07-03 09:12 |只看该作者
1 main = do
2   mapM_ (\(x, y, widget) -> do
3            a <- widgetRun widget
4            putStrLn $ show a
5         ) widgetList
6
7 widgetList :: (Widget w) => [(Integer, Integer, w)]
8 widgetList = []
9
10 class Widget w where
11   widgetRun :: w -> IO ()
---
% ghc --make tmp/test.hs
[1 of 1] Compiling Main             ( tmp/test.hs, /tmp/Main.o )

tmp/test.hs:3:16:
    Ambiguous type variable `t' in the constraint:
      `Widget t' arising from a use of `widgetRun' at tmp/test.hs:3:16-31
    Probable fix: add a type signature that fixes these type variable(s)

论坛徽章:
0
10 [报告]
发表于 2009-07-03 11:33 |只看该作者
a <- widgetRun widget中widget的类型不能确定, 改成: a <- widgetRun widget::你的类型
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP