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

## SML list equality oddness

6

### 問題

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

<事前> <コード> 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

ベストアンサー

たとえば、` 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 )

4  SMLの折り目を使う  ( Using fold in sml )

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 )

2  SML / NJ：ハッシュテーブルの使用方法  ( Sml nj how to use hashtable )

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