2016-07-23 14 views
1

Pythonでは、 "operator"という名前のビルトインパッケージがあります。このパッケージでは、任意の演算子の関数バージョンを使用できます。これは、mapやreduceのような "関数型プログラミング"関数を使うときによく使われ、 "lambda"を使うよりもずっとお勧めです。Haskellの "::"同等の機能は何ですか?

私はHaskellの中に同じ問題を抱えている:私は多くの機能の組成物でどこかトンのユーザMAPMをしたいが、私はそれほどきれいではありませんラムダを使用する必要があります。

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

は、任意のは、そのliekに相当ありますこの:

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

GHC 8.0で "id @String"を実行することができます:https://ghc.haskell.org/trac/ghc/wiki/TypeApplication –

+0

'mapM(asTypeOf" .fromSql。(!! 1))あなたが 'XOverloadedStrings'を持っていなければ、' res' - です。 – Michael

+1

'mapM(fromSql。(!! 1))res'は十分ではありませんか、' mapM((fromSql((1)):: a - > String)res'ですか? – chepner

答えて

1

::StringはPythonのstring(…)の意味でのオペレータが、型注釈ではない、とのような、特殊な構文規則が適用されます。

ただし、関数に

asString :: String -> String 
asString x = x 

を定義し、(::String)を使用することができるようになるが、私は今それを見つけることができません

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

@augustss proposed a language extensionを書くことができます。)

+1

!! 1は最初のものではなく2番目の要素を取得するので、頭を意味するものではありません。 私はアイデンティティを意味するわけではありません、あまり曖昧なタイプのエラーが出るのを止めるヒントです。 – Kamyar

+0

はい私はポイントを得ました。具体的な型のID関数があれば、それを型ヒントのように使うことができます。しかし、それをもう一度定義することを除いて、他の方法がありますか? – Kamyar

+0

これは、単純に型アノテーションを与えることはあまりにも多くの仕事のようです。式 'mapMの型...res'自体を指定することができ、この型推論は 'fromSql'に正しい型を見つける可能性があります。代わりに、 'fromSQL :: _ - > String'(-XPartialTypeSignaturesで)を書くことができます – user2407038

1

chepnerがコメントしたように、タイプヒントを与える必要はほとんどありません。必要なのは

です
mapM (fromSql . (!!1)) res 

...実際にはを使用すると、結果は何らかの形でになります。 (結果を使用しないと、なぜ最初にこれを行うのですか?)

理由:Pythonとは異なり、Haskellは適切なHindley-Milner型システムを持っています。方向と任意のコンテキスト。あなただけの、例えば、

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

を書くのであれば、これはsqlStrs :: [String]ので、fromSqlStringを得るために制限されなければならないことを推測するコンパイラのために十分です。


あり、いくつかの例外はありますが、これらは(唯一のグローバルな定義に、ではないモナドにバインド何かに適用され、またオフにすることができます)単相性制限のみ発生するか、使用している場合† GADT、ExistentialQuantification、RankNTypesなどの拡張機能

関連する問題