什么是" ::" Haskell中的等价函数?

时间:2016-07-23 09:17:26

标签: haskell lambda

在Python中,我们有一个内置的包,名为" operator",我们可以使用它来使用任何运算符的函数版本。它在使用"功能编程"时非常有用。像map和reduce这样的函数,比使用" lambda"。

更好

我在Haskell中遇到同样的问题:我希望用户mapM具有许多函数的组合,但我必须使用不那么漂亮的lambda:

mapM ((\x->x::String).fromSql.(!!1)) res

有没有相同的谎言:

mapM (someFunc(String).fromSql.(!!1)) res

2 个答案:

答案 0 :(得分:1)

::String不是python的string(…)意义上的运算符,而是类型注释,因此适用特殊的语法规则。

但是,您可以定义功能

asString :: String -> String
asString x = x

然后写

mapM (asString.fromSql.(!!1)) res

@augustss proposed a language extension允许使用(::String),但我现在找不到它。)

答案 1 :(得分:1)

正如chepner评论的那样,根本不需要提供任何类型的提示:所有你需要的是

   mapM (fromSql . (!!1)) res

...也就是说,只要您以某种方式实际使用结果。 (如果你不使用结果,那你为什么要这样做呢?)

原因是:与Python不同,Haskell有一个适当的Hindley-Milner类型系统,这可以推断任何方向的类型和任何上下文。所以,如果你只是写,

 do
   sqlStrs <- mapM (fromSql . (!!1)) res
   ...
   mapM_ putStrLn sqlStr

那么这足以让编译器推断出sqlStrs :: [String]因此fromSql必须限制为String

有一些例外情况,但这些只有单态性限制(仅适用于全局定义,不适用于monad中的某些内容,也可以关闭)或使用GADT,ExistentialQuantification或RankNTypes等扩展时。