Haskell Quiz No.12

難易度: λ

以下のプログラムの実行結果はどうなるでしょうか?

#!/usr/bin/env stack
-- stack script --resolver lts-11.17
import Conduit

main :: IO ()
main = runConduit $ yieldMany [1..10] .| iterMC print .| sinkNull

答えは次回

はじめに

前回の問題と答えは以下の通りです。

問題

難易度: λ

以下のプログラムの実行結果はどうなるでしょうか?

#!/usr/bin/env stack
-- stack script --resolver lts-11.17
import Data.Char

main :: IO ()
main = do
  print $ isUpper 'あ'
  print $ isAsciiUpper 'あ'

こたえ

出力結果は以下のようになります。

$ ./Quiz11.hs
False
False

解説

問題をミスりました。実際に出したかったのはこんな感じです。

#!/usr/bin/env stack
-- stack script --resolver lts-11.17
import Data.Char

main :: IO ()
main = do
  print $ isUpper 'A'
  print $ isAsciiUpper 'A'

  print $ isUpper 'A'
  print $ isAsciiUpper 'A'

この結果はこうなります。

True
True
True
False

半角文字だけをパスするようなバリデーションを書く時に isUpper を使うと、全角も True になってしまうので気をつけましょう。

また、ひらがなやカタカナ、漢字を判定したいときは kanji-3.4.0 パッケージがおすすめです。

まとめ

  • 半角アルファベットだけバリデーションしたい場合は isAsciiUpper 等の関数を使う
  • kanji パッケージが便利

以上です。