26

ブロックcase内の式に関するこの構文の問題がよくわかりません。do

正しい構文は何ですか?

私の例を修正して説明できれば、それが最善です。

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 を始める人へのヒントです。問題がある場合は、ソース コード内のタブとスペースを確認してください。

4

2 に答える 2

32

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 つの引数を取り、関数の適用が最も優先されるため、括弧で囲むか ($) を使用する必要があります。

于 2008-10-01T02:51:27.407 に答える
12

同様に:

foo = do
  args <- getArgs 
  case args of
        [] -> return "No Args"
        [s]-> return "Some Args"

wnoise が示唆するようにするのがおそらく望ましいですが、これは誰かがもう少しよく理解するのに役立つかもしれません.

于 2008-10-01T06:31:34.070 に答える