10

私はまだ新しく、関数で使用するリストを作成しようとしており、たまたま logBase x y になるようにできるだけ小さくしたいと考えています。しかし、logBase をこのリストで使用できるものにするのに問題があります。

[1 .. (logBase xy)]

助言がありますか?

4

3 に答える 3

10

どのタイプのエラーが発生したかは投稿しませんが、次のようなものだと思います。

Prelude> let x = 2
Prelude> let y = 7
Prelude> [1 .. (logBase x y)] 

<interactive>:1:7:
    No instance for (Floating Integer)
      arising from a use of `logBase' at <interactive>:1:7-17
    Possible fix: add an instance declaration for (Floating Integer)
    In the expression: (logBase x y)
    In the expression: [1 .. (logBase x y)]
    In the definition of `it': it = [1 .. (logBase x y)]

問題はそれです:

Prelude> :t logBase
logBase :: (Floating a) => a -> a -> a

Floating クラスの型を返しますが、プログラム内の他の変数 (1、'x'、'y') は整数型です。

整数のシーケンスが必要だと思いますか?

Prelude> :set -XNoMonomorphismRestriction
Prelude> let x = 2
Prelude> let y = 42
Prelude> [1 .. truncate (logBase x y)] 
[1,2,3,4,5]

切り捨て、天井または床を使用します。

于 2009-09-09T10:42:52.573 に答える
8

ここに関数リストの1つが必要になる可能性があります。 HoogleHayoo!必要な関数のタイプを入力して関数のリストを取得できるため、この種のツールとして最適です。Haskellのリッチタイプシステムでは、これは非常に便利なツールであり、動的に型付けされた言語や、CやJavaなどの静的に型付けされた言語よりもはるかに便利です。

于 2009-09-09T02:54:31.477 に答える
2

おそらく、ある種の丸め、切り捨て、床、または天井関数が必要です。Int と Float は (ご覧のとおり) 異なる型であり、コンパイラではそれらを混在させることはできません。すぐにリファレンスを見つけます。

于 2009-09-09T02:12:32.417 に答える