質問

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が示唆するように行うことがおそらく望ましいですが、これは誰かが少しよく理解するのに役立つかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top