私の意図は簡単です。私はタイプa -> b
の関数をString -> String
にラップしたいので(異種の関数の束をリストに入れることができるように)だから私は書く:Haskellの `a - > b`型の関数を` String - > String`型に変換する
wrap :: (Read a, Show b) => (a -> b) -> (String -> String)
wrap f = \s -> show $ f (read s :: a)
はしかし、ghc
苦情:
Could not deduce (Read a1) arising from a use of `read'
from the context (Read a, Show b)
bound by the type signature for
wrap :: (Read a, Show b) => (a -> b) -> String -> String
私はコードの私の作品が動作しませんとハックの種類は、私の目標を達成するために必要とされる理由を知りたいですか?
ありがとうございました。暗黙的に(関数内でそれ以外:: a
注釈は型シグネチャにa
から別のタイプを指しているので
{-# LANGUAGE ScopedTypeVariables #-}
...
wrap :: forall a b. (Read a, Show b) => (a -> b) -> (String -> String)
wrap f = \s -> show $ f (read s :: a)
それを:あなたがScopedTypeVariables
ような何かをする必要があります、明示的read s
の種類を指定するには
リストに異種関数を入れておけば、良いhaskellではなく、文字列変換でそれらをすべてラップするのは間違いです。あなたはもっと大きな意味で何をしようとしていますか? – NovaDenizen
これは間違いです。これをしないでください。あなたは、Haskellの強力な型システムとそれに付随する偉大なコンパイル時のチェックをすべて破棄しています。あなたの車が罰金であると言って、それから高速道路で壊れてしまう整備士は、何かを修理するためにあなたに何かを(今はガレージにある間に) (後で、それはより多くのダメージを引き起こした後、コールアウト料金があり、それを修正する男は彼と一緒に必要な部分を持っていない)。スタティックタイピングは良いメカニック、ダイナミックタイピングはそれがいいと言っている人です。 – AndrewC
@NovaDenizen私は間違いなく静的なタイピングをしています。最近私はシンプルなサーバーを書いています。 'a - > IO b'は実装されたサービスを表します。 1つのコンポーネントは '[(String、a - > IO b)]'を '' Map String(a - > IO b) 'に変換することです。しかし型システムはそれを許さない。型の安全性を強化するために、より複雑な型の設計をしています(つまり、クライアントがタイプaの入力に 'a - > IO b '型の入力を与えなければならないので、チェック)。しかし、キャッチは、サーバがハスケルで書かれたクライアントをまったく提供していない可能性があるということです。その場合、私の仕組みは機能しません。 – tfboy