Haskell函数作为一种类型转换

时间:2014-06-11 15:24:05

标签: haskell types

如果我想要一个返回reads列表的(Int, String)版本,我看到的示例是

f x = reads x :: [(Int,String)]

我想知道是否有一种方法可以在无点样式(f = g . reads?)中执行此操作,或者如果这是您在Haskell中不做/不能做的事情。

我没有看到任何使用类型作为参数的例子,所以它可能不可行。

4 个答案:

答案 0 :(得分:6)

我认为你要找的是f = reads :: String -> [(Int, String)]

答案 1 :(得分:6)

执行您所描述的内容的惯用方法是

f :: String -> [(Int, String)]
f = reads

这样做的好处是,如果你有一个多态类型,结果是你所期望的(因为可怕的单态限制)。

答案 2 :(得分:3)

目前无法使用,但我建议使用语言扩展程序SignatureSections,这样您就可以编写f = (:: [(Int, String)]) . reads

答案 3 :(得分:0)

是的,确实存在。

fixIS :: [(Int,String)] -> [(Int,String)]
fixIS = id

当我想解决多态时,我通常会有几个函数(即当我想将Netwire线的抑制monoid修复为()时,或者我想修复{{1}时到Num a)。显然,如果你只需要那一次就没有意义。您可能希望这样做的原因是它偶尔会在函数定义中更好地流动。根据你的haskell编译器的智能程度,它可能效率较低(理论上,Int在大多数情况下都可以被删除...不确定如果id给另一个{GH},GHC是否会主动寻找虽然名字。)