0

do 表記を使用する関数から Maybe 値を返そうとしていますが、うまく動作しないようです。この関数は、文字列 (「ファイル名」) と検索するパスを受け取ります...

findIn :: String -> Path -> Maybe Path
findIn search start = do
    file <- ls start
    if ((filename file) == search)
      then Just file
      else Nothing

どこ...

ls :: Path -> Array Path
filename :: Path -> String

しかし、「Count not match Type Array with type Maybe」というエラーが表示され続けるため、コンパイラは do 表記が配列を返すことを期待しているようです。多分値を返すにはどうすればよいですか?

4

2 に答える 2

2

そのようにモナドを混在させることはできません。

あなたが書くとき:

file <- ls start

「配列内の各値に対して...」と言うのと少し似ているfileので、複数の可能な値のコンテキストにいます。

ただし、残りのコードは のコンテキストにありMaybe、1 つ (または 0) の値しか処理できません。

モジュールData.Foldableには、findいくつかの基準に一致する単一のアイテムを検索することにより、メイン関数の作業の大部分を行う関数があります。実際の型はより一般的ですが、配列に制約されると次のようになります。

find :: forall a. (a -> Boolean) -> Array a -> Maybe a

次に、次のように書くことができます。

findIn search start = find (\x => x == search) $ ls start
于 2016-04-03T01:34:48.487 に答える