2

Haskell の学習を始めたばかりで、hmatrix ライブラリの使用に問題があります。累乗反復法を使用して固有値を計算する簡単なコードを書きたいと思います。私はから始めます:

c = fromList [4.0, 4.0, 4.0, 4.0]::Vector Double
n = norm2 c

ベクトル c を作成し、ベクトルの 2 ノルムを見つけます。

との乗算c:

c * 2 (Works)
c * 0.5 (Works)
c * pi (Works)
c * n (Error)

私はそれをチェックしました:

>:t pi
pi :: Floating a => a
>:t n
n :: Double

問題は型にありますが、それを回避する方法がわかりません。

(/)この場合、独自の関数を定義する必要がありますか?

更新: ghci から取得したエラー:

Couldn't match expected type `Vector Double'
            with actual type `Double'
In the second argument of `(*)', namely `n'
In the expression: c * n
In an equation for `it': it = c * n
4

2 に答える 2

2

タイプをチェックすることで正しいことをしています。もう少し明確にすれば、何が起こっているかがわかります。

Prelude Numeric.LinearAlgebra> :t let a = 2; b = c * a in a
let a = 2; b = c * a in a :: Vector Double

問題は、の型がnorm2 cisDoubleであり、したがって a にできないことです。Vector Double

2先ほどのポリモーフィックの値を見てみましょう。

Prelude Numeric.LinearAlgebra> let a = 2; b = c * a in a
fromList [2.0]

代わりに、n = fromList [norm2 c]

編集:まったく同じライブラリが関数scalarを公開しており、scaleこれを調べる必要があります。

于 2013-11-07T04:52:03.003 に答える
2

(*)両方の引数が同じ型であると仮定します。

(*) :: (Num a) => a -> a -> a

最初の 3 つの乗算が機能した理由は、3 つのケースすべてで、正しい引数がVector Double!として型チェックに成功したためです。

ghciその理由を確認するために、これら 3 つの引数の型を調べてみましょう。

> :t 2
2 :: Num a => a
> :t 0.5
0.5 :: Fractional a => a
> :t pi
pi :: Floating a => a

次の 3 つのインスタンスを提供するVector Doubleため、これら 3 つすべてが有効な です。hmatrix

instance Num (Vector Double) where ...

instance Fractional (Vector Double) where ...

instance Floating (Vector Double) where ...

つまり、これらのインスタンスのおかげで、Haskell は20.5、およびpiを自動的に s に変換します。Vector Double

これは、最後の例が型チェックを行わない理由を説明しています。 nは typeDoubleを持っています。つまり、 としても型チェックできる可能性はありませんVector Double

于 2013-11-07T04:54:01.627 に答える