doブロック内のcase式のHaskell構文
質問
do
ブロックの case
式でこの構文の問題を理解することはできません。
正しい構文は何ですか?
私の例を修正して説明できるなら、それが最善でしょう。
module Main where
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return case args of
[] -> "No Args"
[s]-> "Some Args"
少し更新。私のソースファイルはスペースとタブが混在しており、あらゆる種類の問題を引き起こしていました。 Haskellで始める他の人へのヒントです。問題がある場合は、ソースコードのタブとスペースを確認してください。
解決
returnは(オーバーロードされた)関数であり、最初の引数がキーワードであることを期待していません。括弧で囲むことができます:
module Main where
import System(getArgs)
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return (case args of
[] -> "No Args"
[s]-> "Some Args")
または便利なアプリケーション演算子($)を使用:
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
スタイルごとに、別の関数に分割します:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
ただし、returnは1つの引数を取り、関数の適用が最も優先されるため、括弧で囲むか($)を使用する必要があります。
他のヒント
同等:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
wnoiseが示唆するように行うことがおそらく望ましいですが、これは誰かが少しよく理解するのに役立つかもしれません。
所属していません StackOverflow