SMLリスト平等の奇妙さ -- sml フィールド と smlnj フィールド 関連 問題

SML list equality oddness












6
vote

問題

日本語

このビットのコードを持っています:

<事前> <コード> fun foldr2(f, x::xs) = if xs = [] then x else f(x, foldr2(f, xs))

タイプシグネチャ

<事前> <コード> (''a * ''a -> ''a) * ''a list -> ''a

はかなり前方に見え、 xs = [] の比較のために、平等タイプと引数としての等価タイプのリストを越えて機能する関数を取ります。ただし、SML / NJ Realsの場合、 xs = []7 などの入力で動作する理由で機能します。誰かが私がこの魔法が起こる理由にいくつかの光を当てるのを手伝ってくれる?

英語

I have this bit of code:

fun foldr2(f, x::xs) =     if xs = [] then       x     else       f(x, foldr2(f, xs)) 

With the type signature

(''a * ''a -> ''a) * ''a list -> ''a 

Looks pretty straight-forward, it takes a function that works over equality types and a list of equality type as arguments, because of the xs = [] comparison. However, for some reason it works on input such as (op +, [2.3, 2.7, 4.0]), when in SML/NJ reals are not an equality type. Can anyone help me shed some light on why this magic occurs?

</div
     
 
 

回答リスト

2
 
vote
vote
ベストアンサー
 

私はそれが + が実際に過負荷になっている魔法のような方法で行うことが信じています。私にとって、このほとんどはコンパイラのバグであることを報告することについて、SML97の定義を調べる必要がありますが、私は正しい行動があることを意味するものを見る必要があります。 <コード> + のオーバーロードは、SML、IMHOの厄介な暗い角のものです。

たとえば、 real * real -> real の形式の関数を定義し、引数として foldr2 に渡してください。 <コード> fun f (x : real * real) = 134.5 foldr2 (f, [1.4, 2.25, 7.0]) stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required]

op + に型注釈を追加する場合は、タイプエラーを誘発することもできます。これは、基本的に + のオーバーロードであるという結論を説明しました。不思議な効果を引き起こします。

 

I believe it's to do with the magical way in which + is overloaded for reals. To me, this almost verges on being a compiler bug, although I would have to look at the SML97 definition to see exactly what the correct behaviour is meant to be. The overloading over + is something of a nasty dark corner in SML, IMHO.

For example, if you define a function that is of type real * real -> real and pass that as an argument to foldr2 you get the type error you were expecting:

fun f (x : real * real) = 134.5 foldr2 (f, [1.4, 2.25, 7.0])   stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required] 

You can even induce the type error if you just add a type annotation to op +, which basically led me to the conclusion that it is the overloading of + that is causing the mysterious effect.

</div
 
 

関連する質問

2  標準ML 2進数ツリー  ( Standard ml binary tree ) 
私はまだこれに問題があるので、私はもっと助けを求めるつもりです。 私たちは与えられます: <事前> <コード> datatype which = STRING of string | INT of int パート1.データがツリーの葉のみにあるタイプの値を...

4  SMLの折り目を使う  ( Using fold in sml ) 
現時点でSMLNJを学ぼうとしています。折りたたみ関数に問題があります。 私がしようとしているのは、折りたたみパターンを使用して関数とリストを取ります。リストの先頭にリストを登録して、その要素をリストに追加するかどうかを判断します。これは私が何を意味するのかの...

1  SMLで高次関数のみを使用してマトリックスの転置を取りたいが、本当にスタックです  ( I want to take the transpose of a matrix using only higher order functions in sm ) 
SMLでの高次関数のみを使用して行列の転置を取りたいが、私は本当にスタックしています、ここに私が持っているものです <事前> <コード> fun transpose [] = [] | transpose ([]::_) = [] | transpose m...

1  SMLNJ:繰り返しの場合の表現とコンストラクタ名の一致をマージする  ( Smlnj merging a repetitive case expression and matching part of a constructor n ) 
コンストラクタの書き込みパターンに関して2つの質問があります: 私は2つのパターンのコンストラクタを1つにマージしたいので、もう一度同じ式を書く必要はありません。 コンストラクタの一部をパターンで一致させたい(私はそれが不可能であると思いますが、ショットの価...

0  標準のML順列  ( Standard ml permutations ) 
リスト内のすべての値の順列に関数を作動させています。 これまでのところ私が持っているものです: <事前> <コード> //MY ROTATE FUNCTION fun rotate e [] = [[e]] | rotate e (x::xs)= (e::x...

0  SML:DELEMENTではなく、機能を定義していません  ( Sml declear but not define function ) 
これは一例です。これら2つの機能が接続されています。あなたは本当に最低のものを呼び出したいです。その後、2つの最小数を返すはずです。これは、REDUCEMAX関数をコンパイルするときには、最低の時刻未定義関数の呼び出しを呼び出します。 <事前> <コード> F...

-2  SMLでの強い接続部品(SCCグラフアルゴリズム)  ( Strongly connected components scc graph algorithm in sml ) 
ここで尋ねられていることを知るのは難しいです。この問題はあいまい、曖昧で、不完全で、過度に広く、または修辞的であり、現在の形で合理的に回答することはできません。再開できるようにこの質問を...

0  SMLの関数として引数を宣言する方法は?  ( How to declare an argument as a function in sml ) 
私の質問は次のようになります。 Fun F1(F2:Type-&GT; Type)を入力することなく、タイプの制約を使用せずに関数を受信する関数を定義することができますか。 関数として引数f2を使用する方法を考えようとしていますが、どこにでも得られません。 任...

2  SML / NJ:ハッシュテーブルの使用方法  ( Sml nj how to use hashtable ) 
私は本当にSMLでハッシュテーブルを作成したいです、それはすでにSML / NJでの構造があるようです。 問題は、どうやって使うのですか?私はSMLで構造を使う方法、そして私が読んだ本の中の非常に基本的な例のいくつかを私に与えてくれた、私が正しい方法さえ知って...

0  文字列を標準ML [DUPLICATE]のリストに変換  ( Convert string to list in standard ml ) 
この質問はすでにここで回答を持っています 閉じられた 10年前。 可能な重複: ml(smlnj) 私はこのような値を持つ文字列値を持っています: <事前> <コード> "[(1,2,3),(2,3),(6,8)]" -> s...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有