🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

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

Haskell

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

データ構造

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

Q&A

解決済

1回答

1021閲覧

【Haskell】File/Folder操作

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

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

Haskell

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

データ構造

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

0グッド

1クリップ

投稿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/ツールのバージョンなど)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このような 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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/12 10:53

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

退会済みユーザー

2021/01/12 12:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問