2009-05-28 9 views

答えて

38

まあ

f :: [String] -> [Int] 
f = map read 

ませんか?

+0

うまくいきました! :) tnx – pier

2

このような質問に対する一般的な答えは、タスクを複数の部分に分割することです。[String] -> [Int]は、String -> Int[a] -> [b]の組み合わせのように見えます。 Hoogle(リンク)...見てみましょう、あなたに

$ hoogle両方にいくつかの結果が得られます '文字列を - > int型
Test.HUnit.Baseラベル::文字列 - >ノード
プレリュードエラー: [チャー] - >
プレリュード長:: [A] - >のInt
Data.List長:: [A] - >のInt
Data.Char digitToInt ::チャー - >のInt
Data.Char ord :: Char - > Int
Debug.Trace trace :: String - > a - > a
Network.Buf ferType buf_fromStr :: BufferOp - >文字列 - >
Network.Socketお送り::ソケット - >文字列 - > IOのInt
Graphics.UI.GLUT.Callbacks.Windowシャアシャア:: - >キー
プレリュード読みます:: =>文字列を読む - >
読み:: =>文字列を読むText.Read - >
Data.String fromString :: IsString A =>文字列 - > fromString
GHC.Exts :: =>文字列をIsString - >
Control.Monad.Trans.Error strMsg ::誤差A =>文字列 - >
Control.Monad.Error.Class strMsg ::誤差A =>文字列 - >
。 ..

ああ、ごみが多い。 >
プレリュード長:: [A] - - >のInt
Data.List長我々は最初の

プレリュードエラー:: [シャア] ...あなたとは何の関係もないパッケージからのものを排除することができます:: [A] - >のInt
Data.Char digitToInt ::シャア - >のInt
Data.CharのORD ::シャア - >のInt
プレリュード読み:: =>文字列を読む - >
テキスト。 read :: read a => String - > a
Data.String fromString :: IsString a =>文字列 - > a
Text.Printfのprintf :: PrintfType R =>文字列 - > R

errorはほとんど何をしたいのように聞こえます。 lengthもありません。 digitToInt?一種の音で、実際には動作しますが、一桁の数字だけで動作します。 read?あなたが期待していた名前ではないかもしれませんが、これについては正しいことです。文字列をより意味のあるもの(数字のようなもの)に変換することは、テキストを読むことに似ています。
プレリュードマップ::( - > B -

$ hoogle '> [B] [A]':

右は、他の側にHoogleは、私たちは右フロントアップしたいものを提供します) - > [a] - > [b]
Data.List map ::(a - > b) - > [a] - > [b]
Prelude concatMap ::(a - > [b]) - > [a] - > [b]
Data.List concatMap ::(a - > [b]) - > [a] - > [b]
Data.Maybe mapMaybe ::(a - > Maybe b) - > [a] - > [b]
Prelude cycl e :: [a] - > [a]
Data.Listサイクル:: [a] - > [a]
Prelude init :: [a] - > [a]
Data.List init :: [ A] - > [A]
プレリュード逆:: [A] - > [A]

再度名前ではない可能性がある、これらの機能のほとんどは、 "マップ" と何かと呼ばれて見ての通りあなたは期待していましたが、明らかにそれがこの操作と呼ばれています!あなたが探しているものはかなり簡単です。

最後に、これらの2つの機能を組み合わせる必要があります。 mapは最初の引数として別の関数を必要とします - それは明らかにreadです!したがって、mapreadに適用するだけです。次の引数は[a]のリストです:aha、もう完了です!

あなたはGHCiのを起動することでこれを確認することができます

プレリュード>:Tマップは
マップが読み読み::読むのB => [文字列] - > [B]

ありますまだbIntの代わりにここに入れていますが、気にすることはありません。bはあなたが好きなタイプです。 - Readインスタンスがあることを条件とします。 Intを有する:

プレリュード>は:私がint = GHC.Types.I#GHC.Prim.Int#
データをINT - GHC.Types'
インスタンス有界のInt `で定義 - で定義され` GHC.Enum '
インスタンス列挙のInt - GHC.Enum `で定義'
インスタンス民 - - GHC.Classes' GHC.Real`で定義
インスタンス積分のInt」 'で定義され
インスタンス式のInt Int - GHC.Numに定義されています
インスタンスOrd Int - `GHC.Classes 'に定義されています
インスタンス `GHC.Read 'でInt定義されています
インスタンスReal Int - 定義済み` GHC.Real'
インスタンス `GHCで定義されています。ショー」

21

これは失敗します。それを行うには

map read ["1","2"] 
[*Exception: Prelude.read: no parse 

方法は次のとおりです。GHCiの社外

map (read::String->Int) ["1","2"] 
[1,2] 
:: [Int] 

、.HSファイルには次のようになります。

let intList = map (read::String->Int) ["1","2"] 
関連する問題