2013-08-05 11 views
13

typeでタイプシノニムを作成すると、ghc/ghciは明示的に使用されるときはいつでも元のタイプの代わりに使用しますが、推測タイプから一致するシノニムに逆方向には動作しません。ある種の最も抽象的なシノニムを得ることは、モナド・スタックの同義語とおそらく同義語の同義語を定義する複雑なアプリケーションとライブラリを学ぶのには非常に便利です。haskellの型同義語を解決する方法はありますか?

誰もこのようなコードを書いたことがありますか?私はそれがバックトラックと思われ、いくつかの擬似候補も生成するでしょう(例えば、2つのタイプがStringのエイリアスであれば、Stringを解決しなければならないときはいつでも候補になります)。

+0

私はまったく同じアイデアを思いついています。これは 'パイプ'と 'レンズ'には本当に便利だからです。理想的には、ルールのように動作するコンパイラプラグマを指定し、推論された型のパターンをマッチさせ、同等の型のシノニムに書き換えます(マッチが複数ある場合は何らかの優先順位を付けます)。 –

+1

私は数日前に "Chthuluのタイプシグネチャ"を述べたブログ記事を思い出しました:http://joelt.io/entries/yesod-in-production – BruceBerry

+0

gsocなどのようなもののように聞こえます – jozefg

答えて

1

質問はありません。型シノニムはしばしば "高水準コード"の型をうまく指定するのに使われますが、それらの型を低レベル/ヘルパーコード(より具体的な型の観点から定義されています)に渡すとすぐに、同義語が適用されますか?次の点を考慮してください

type Title = String 
type Name = String 

capitalise :: String -> String 

my_title = "Mayor" :: Title 

shouted_title = capitalise my_title :: ??? 

どの型チェッカーがheleper機能capitaliseに入る文字列は概念的capitaliseから出てくる文字列と同じタイプであることを知っていますか?複数のエイリアスが存在する場合、どのようにタイプチェッカーで使用するかを選択する必要がありますか?

0

Fregeコンパイラ、IDEとREPLは、 "nice"タイプを表示するように要求されたときにタイプアプリケーション( - ()のアプリケーションを除く)に対してこれを実行しようとします。ここでは一例online session抜粋です:

frege> type Flubber = (Int, Double) 
frege> x = (42, 3.0) 
frege> :t x  
Flubber 
frege> y = [x,x,x,x] 
frege> :t y 
[Flubber] 

ので、原則的に、それはまた、Haskellで動作するはずです(おそらくHaskellの2010型システムの相対的で特定の拡張子を法)。

@トーマス氏が答えて指摘したように、タイプエイリアスを代用する方法は複数あるかもしれないので、実際には誤解を招く可能性があります。

関連する問題