3

a)haskellでからStringにキャストする必要があります。int文の3番目の単語を文字列として取得する関数がありますが、すべての文の3番目の単語は数字(int)です。文字列から整数にキャストして、後でその数字を使用して次のような操作を行うにはどうすればよいですか。追加またはマルチ?

getThirdWord :: String -> String
getThirdWord = head . tail . tail . words

b)VisualHaskellStudioを使用しています。Visual Haskell Studioのような機能をどのように使用できmapますか?zipそれらを機能させるためにvhsに含める必要のあるプラグインはありますか?

よろしくお願いします!

4

4 に答える 4

14

もちろん、ヤコビーの答えは正しいです。2 つのコメントをさせてください。

  1. readは非常に一般的です。に変換StringするだけではありませんInt。戻り値の型はコンテキストによって異なります。この場合、getThirdWordは と定義されているString -> Intため、read何をすべきかがわかります。これは常に当てはまるとは限らないため、 を使用中にコンパイル エラーが発生した場合は、これをread覚えておいてください: Haskell が戻り値の型を理解するのを助ける必要があるかもしれません。
  2. 現在head . tail . tail、3番目のリスト要素を取得するために使用しています。たとえば、23 番目の要素が必要な場合はどうでしょうか。より保守しやすく読みやすい解決策は、 を使用すること(!!)です。この方法では、任意のインデックスでリスト要素を取得できます。したがって:

    thirdWordAsInt :: String -> Int 
    thirdWordAsInt = read . (!! 2) . words
    

    (インデックスは 0-indexed であるため、3 ではなく 2 に注意してください。)

于 2009-11-26T14:23:04.590 に答える
6

キャストに関しては、読み取り関数を見てください。

getThirdWord :: String -> Int
getThirdWord = read . head . tail . tail . words

Visual Haskell Studioは、バックエンドが Haskell 仕様を完全にサポートし、マップとフォールドを含むライブラリを含むGHCを使用するという点で、IDEのみのようです。

于 2009-11-26T13:48:26.780 に答える
3

2番目にYacobyを使用しますが、 /とはread両方とも部分関数であり、空のリストで失敗する可能性があることに注意してください。代わりにパターンマッチングを使用できる場合は、避ける方がよいと思います。例えば、headtailreadhead

get3rd :: String -> String
get3rd s =
  case (take 3 $ words s) of
    [_,_,w]   -> w
    otherwise -> ""

この関数はどの入力に対しても安全です(3語未満の場合は空の文字列を返すだけです)。確かに、リストが常に空でないことが絶対に確実な場合は、head/を使用できますtail

を使用readすると、例外をキャッチするか(あまり便利ではありません)、reads代わりに次を使用できます。

toInt :: String -> Maybe Int
toInt s =
  case reads s of
    [(i,_)]   -> Just i
    otherwise -> Nothing

-- test cases
main = do
  print . toInt . get3rd $ "1 2 3"
  print . toInt . get3rd $ "one two three"
  print . toInt . get3rd $ "short list"

これは数値をtoInt返すか、解析できない場合に返されます。または、 Safeライブラリとその機能を使用することもできます。JustNothingreadMay

于 2009-11-26T16:10:52.923 に答える
0

皆さんは大丈夫ですが、テキストの読み取り表示を支援することを学ぶときに思いついた非常にエレガントで便利な機能があると思うので、投稿します。

as :: (Read a, Show a) => (a -> a) -> String -> String
as f = show . f . read

Prelude> as (+1) "7"
"8"

Prelude> as (+(1/2)) "5"
"5.5"

便利ですね。=P. またxs!! nは xs の n 番目の要素を取得します。印刷する簡単な方法については、他の回答をご覧ください。

于 2009-11-26T17:07:21.840 に答える