質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

【Haskell】File/Folder操作

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

1回答

0グッド

0クリップ

590閲覧

投稿2021/01/09 04:55

フォルダーの中から1つのファイルを取得するプログラム

フォルダー名とその中に入っているファイル名を指定して、ファイルを探索したいです。

データは授業資料を扱うフォルダーです。
曜日フォルダー(授業名フォルダー(資料ファイル))) のようになっています。
授業名と資料名よりファイルを指定したいです。

発生している問題・エラーメッセージ

結果が該当なしになっている

該当のソースコード

Haskell

1data Document = 2 File String | Folder String [Document] 3 4files item = 5 case item of 6 File name -> if name /= "1.pdf" then [] else [name] 7 Folder folder_name items -> [name | item <- items , name <- files item , folder_name == "Programing2"] 8 9 10main = 11 print $ files $ Folder "2020" [ Folder "Mon" [ Folder "Programing1" [File "1.pdf" , File "2.pdf"] , Folder "Math1" [File "1.pdf" , File "2.pdf"] ] , 12 Folder "Tue" [ Folder "Math2" [File "1.pdf" , File "2.pdf"] ] , 13 Folder "Wed" [ Folder "English" [File "1.pdf" , File "2.pdf"] ] , 14 Folder "Thu" [ Folder "Sience" [File "1.pdf" , File "2.pdf"] ] , 15 Folder "Mon" [ Folder "Programing2" [File "1.pdf" , File "2.pdf"] ] 16 ] 17

試したこと

補足情報(FW/ツールのバージョンなど)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

2

ベストアンサー

このような find 関数でどうでしょうか?

haskell

1import Data.Maybe (isJust) 2 3data Document 4 = File String 5 | Folder String [Document] 6 deriving Show 7 8find :: [String] -> Document -> Maybe Document 9find [] _ = Nothing 10find [n] f@(File n') 11 | n == n' = Just f 12 | otherwise = Nothing 13find (n:ns) (Folder n' docs) 14 | n == n' = 15 case filter isJust $ find ns <$> docs of 16 [] -> Nothing 17 [d] -> d 18 _ -> error "there are the same name documents" 19 | otherwise = Nothing 20find _ _ = Nothing 21 22main :: IO () 23main = do 24 let 25 docs = 26 Folder 27 "2020" 28 [ Folder 29 "Mon" 30 [ Folder 31 "Programing1" 32 [ File "1.pdf" 33 , File "2.pdf" 34 ] 35 , Folder 36 "Math1" 37 [ File "1.pdf" 38 , File "2.pdf" 39 ] 40 ] 41 , Folder 42 "Tue" 43 [ Folder 44 "Math2" 45 [ File "1.pdf" 46 , File "2.pdf" 47 ] 48 ] 49 , Folder 50 "Wed" 51 [ Folder 52 "English" 53 [ File "1.pdf" 54 , File "2.pdf" 55 ] 56 ] 57 , Folder 58 "Thu" 59 [ Folder 60 "Sience" 61 [ File "1.pdf" 62 , File "2.pdf" 63 ] 64 ] 65 ] 66 print $ find ["2020", "Tue", "Math2", "1.pdf"] docs

Wandbox で実行

投稿2021/01/09 09:28

kakkun61

総合スコア285

A_kirisaki👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/01/12 10:53

ご回答ありがとうございます。 参考になります。 また質問なのですが f@と<$>という演算子はどのようなものですか?
退会済みユーザー

退会済みユーザー

2021/01/12 12:50

ありがとうございます。 理解しました!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)