在Python中,我们有一个内置的包,名为" operator",我们可以使用它来使用任何运算符的函数版本。它在使用"功能编程"时非常有用。像map和reduce这样的函数,比使用" lambda"。
更好我在Haskell中遇到同样的问题:我希望用户mapM具有许多函数的组合,但我必须使用不那么漂亮的lambda:
mapM ((\x->x::String).fromSql.(!!1)) res
有没有相同的谎言:
mapM (someFunc(String).fromSql.(!!1)) res
答案 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等扩展时。