1

引数を取得してオフセット時間を設定するコードを以下に示します。

setOffsetTime :: (Ord a, Num b)=>[a] -> b
setOffsetTime [] = 200
setOffsetTime (x:xs) = read x::Int

しかし、コンパイラは「setOffsetTime の型シグネチャによってバインドされたコンテキスト (Ord a, Num b) から (b ~ Int) を推測できませんでした :: (Ord a, Num b) => [a] -> b

また、float をデフォルト値にしたい場合、200.0 を使用できないこともわかりました。コンパイラは、「リテラル `200.0' から生じる (分数 b) を推測できませんでした」と言っています。

他の関数で使用できるように、引数を使用して変数を格納する関数として (プレリュードではなく) コードを表示できますか? main = do でこれを行うことができますが、これを実現するためにエレガントな関数を使用したいと考えています。Hasekll にグローバルな定数はありますか? 私はそれをグーグルで検索しましたが、そうではないようです。

簡単ではありませんが、Haskell を使用して Python スクリプトの一部を置き換えたいと考えています。

4

2 に答える 2

6

この型シグネチャは、あなたが思っていることを意味するものではないと思います:

setOffsetTime :: (Ord a, Num b)=>[a] -> b

つまり、「型クラスのメンバーであるあなたが[a]選択した任意の型について、 type の値を私に与えた場合、型のメンバーであるあなたが選択した任意の型について、typeの値を提供します」クラス"。呼び出し元は、呼び出されるたびに使用される特定のタイプを選択できます。a OrdbbNumabsetOffsetTime

したがって、型Int(またはFloat、または特定の型) の値を返そうとしても意味がありません。Intは確かに型クラスのメンバーですが、型クラスのメンバーではありNumませNum。その型シグネチャによれば、Numこれまでに見たことのないまったく新しいインスタンスを作成し、モジュールからインポートsetOffsetTimeして、それを呼び出して新しい型の値を取得できるはずです。

許容可能な戻り値を見つけるには、同様に任意の を返す関数のみNumを使用できます。特定の具象型の関数は使用できません。

存在型は本質的に、呼び出し先が型変数の値を選択できるようにするためのメカニズムです (そして、その型が何であるかに関係なく、呼び出し元が機能するように作成する必要があります)。まだ学んでいます。

于 2013-04-18T04:08:54.003 に答える
4

関数の実装が正しいと確信している場合、つまり、入力リストの最初の要素を返す数値として解釈し、その200ような引数がない場合に返す必要があると確信している場合は、型がsignature はその実装に一致します (現在は一致していません)。

これを行うには、たとえば、型シグネチャを削除して、型を推測するように ghci に依頼できます。

$ ghci
GHCi, version 7.6.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :{
Prelude| let setOffsetTime []       = 200
Prelude|     setOffsetTime (x : xs) = read x :: Int
Prelude| :}
Prelude> :t setOffsetTime
setOffsetTime :: [String] -> Int
Prelude> :q
Leaving GHCi.

$

本当に、

setOffsetTime          :: [String] -> Int
setOffsetTime []       =  200
setOffsetTime (x : xs) =  read x :: Int

正常にコンパイルされます。

もう少し一般的なタイプが必要な:: Int場合は、2 番目のケースから属性を削除できます。上記のメソッドは、次のように記述できることを示しています

setOffsetTime          :: (Num a, Read a) => [String] -> a
setOffsetTime []       =  200
setOffsetTime (x : xs) =  read x

質問に追加したコメントから、関数が浮動小数点数を返すことを望んでいることがわかりました。その場合、あなたは書くことができます

setOffsetTime          :: [String] -> Float
setOffsetTime []       =  200.0
setOffsetTime (x : xs) =  read x

または、より一般的に:

setOffsetTime          :: (Fractional a, Read a) => [String] -> a
setOffsetTime []       =  200.0
setOffsetTime (x : xs) =  read x
于 2013-04-18T02:48:48.580 に答える