ノート・プリント・参考書などは持ち込み可である。
携帯電話などの通信機能を持つものは持ち込み不可である。
ネットワークに接続して WWW を閲覧しても良いが、掲示板、チャット、 メールなどで生身の人間と通信することは禁じる。
テストの配点は50点である。 合格はレポートの得点を加点して、100 点満点中 60 点以上とする。
以下の問に答えよ。
Ⅰ. (記述問題)
(必須)語句: | (13 × 2 点) |
プログラミング言語(やその処理系)で用いられる次の 6 つの語句のう 2 つを選択し説明せよ。その際、実際に動作するソースコードなど、 具体的な例を挙げよ。ただし、講義プリントにのっている例 やネットで見つかる例そのままではなくオリジナルの例を考えること。
カプセル化 (encapsulation)
高階関数 (higher-order function)
遅延評価 (lazy evaluation)
非決定性 (nondeterminism)
接続 (あるいは継続) (continuation)
コルーチン (coroutine)
(ボーナス問題)自由記述: | (最高 20点) |
最近、小学生に対するプログラミング教育が盛んになっている。あなた も、春休みに叔父さんと叔母さんの家に一泊二日で行って、10 歳のいとこ に「プログラミングの神髄」を教える家庭教師のアルバイトをすることになっ た。ここで「プログラミングの神髄」とは特定のプログラミング言語やプラッ トフォームによらない、プログラミングの背後にある考え方をいう。
あなたなら、どのような題材を選んで、どのように教えるか?計画を立てよ。 なお、叔父さんと叔母さんは金に糸目をつけなくても良い、と言っている。
問 Ⅱ はペーパー(紙)問題(ラムダ計算)とオンライン問題の選択になっている。
問 Ⅱ もオンライン問題を選択する場合は、次の問題を続けて解答せよ。
問 Ⅱ でペーパー問題(ラムダ計算)を選択する場合は、PC を閉じるかシャットダウンし、 挙手などをして問題用紙・解答用紙を受け取ること。
なお、ペーパー問題の問題用紙を見てから、オンライン問題を選択しても良いが、 その場合は、PC を起動するまえに、問題用紙・解答用紙を返却すること。
また、ペーパー問題の解答用紙を提出してから、PC をふたたび起動し、問 Ⅰ の解答を続けてもよい。
Ⅱ. (Haskell プログラミング問題)
以下の a. b. いずれかを選択して解答せよ。 (両方、解答した場合は、ボーナス点として採点する。)
(選択)IO モナド: | (24 点) |
IO
モナドを利用して、main
関数を持つ、以下のような Haskell プログラムを作成せよ。
入力文字列を行
注意: 通常は “単語” には「,」や「.」 などの句読点は含まれないが、この問では、空白(タブ、改行を含む)以外の文字が連続するものと 解釈せよ。
ヒント: getContents
を、lines
, unlines
, words
, unwords
,
reverse
などと組み合せて使う。
入力例
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
出力例
do sed elit, adipiscing consectetur amet, sit dolor ipsum Lorem ad enim Ut aliqua. magna dolore et labore ut incididunt tempor eiusmod ut nisi laboris ullamco exercitation nostrud quis veniam, minim in dolor irure aute Duis consequat. commodo ea ex aliquip nulla fugiat eu dolore cillum esse velit voluptate in reprehenderit in sunt proident, non cupidatat occaecat sint Excepteur pariatur. laborum. est id anim mollit deserunt officia qui culpa
(選択)命令型言語の模倣: | (24 点) |
次の C の関数とほぼ同等な Haskell の関数を定義せよ。
「ほぼ」というのは整数の精度などに起因する違いなどは除く、という程度の意味である。
Util コンパイラーを使って良い。 その場合は、用いた Util のソースコードも(Haskell ソース中のコメントとして)示すこと。
ハンドコーディング(ツールを使わずに自分の手でプログラムを作成すること)しても良い。 モナドを明示的に使わなくてもよい。(この問では“同等”の根拠を記す必要はない。)
ヒント:
C の
「%
」演算子に対応する Haskell の演算子は `mod`
、
C の「!=
」に対応するのは Haskell の「/=
」である。
また、Haskell の整数の除算は `div`
である。
少なくとも foo 4
(値は 2 になる)
foo 11
(値は 14 になる)foo 27
(値は 111 になる)
は確認せよ。