演算子=関数?

のびのびなHaskell日記さんのところのid:muscovyduckさんのコメントより

カッコを外すと問題が生じるのは、'-'(マイナス)も実は関数(二項演算子)だからです

二項演算子は関数では無く、()で囲んだときに関数になると思っていたのですが、ほんとのところどうなんでしょうか?

$

最近は、いそがしくてSICPの問題が解けていないんですが、ふつうのHaskellプログラミングを読んでいます。

ふつけるを読んでいて、入門Haskellにもでてきていたのですが、$というものの便利さに気づきました。
入門Haskellでは、$は何もしない関数として紹介されていたので、意味がわからなかったので、サンプルもスルーしていたみたいでした。

$は、右結合をもつ関数です。右結合をもち、何もしない関数。
どんな場面で便利かというと、例えば、こんなコード。

dol x = take 5 ( reverse ( replicate 100 x))

のような括弧が多いコードを

dol x = take 5 $ reverse $ replicate 100 x

のように、括弧を減らして読みやすくすることができます。
$は先ほど述べたように右結合の関数なので、右から関数が適用されていきます。
自分は、括弧がある程度多いと、なんとなくLispっぽく感じてしまうので、この$が大好きです。

デジタル表示

SICPは、もともと大学の教科書のため、数学的な問題が前半多いです。
なので、たまには違うジャンルのプログラムでも書いてみます。
今回は、Best of Ruby Quizという本に出てくる問題。
Quiz2。数字の文字を引数で受け取り、電卓の様な表示を行うというプログラム。
方針としては、数字をAAで表現するリストをつくり、
順に表示させてみます。

import Data.Char
list0 = [" -- " ,"    " ," -- " ," -- " ,"    " ,\
" -- " ," -- " ," -- " ," -- " ," -- "]
list1 = ["|  |" ,"   |" ,"   |" ,"   |" ,"|  |" ,\
"|   " ,"|   " ,"   |" ,"|  |" ,"|  |"]
list2 = ["|  |" ,"   |" ,"   |" ,"   |" ,"|  |" ,\
"|   " ,"|   " ,"   |" ,"|  |" ,"|  |"]
list3 = ["    " ,"    " ," -- " ," -- " ," -- " ,\
" -- " ," -- " ,"    " ," -- " ," -- "]
list4 = ["|  |" ,"   |" ,"|   " ,"   |" ,"   |" ,\
"   |" ,"|  |" ,"   |" ,"|  |" ,"   |"]
list5 = ["|  |" ,"   |" ,"|   " ,"   |" ,"   |" ,\
"   |" ,"|  |" ,"   |" ,"|  |" ,"   |"]
list6 = [" -- " ,"    " ," -- " ," -- " ,"    " ,\
" -- " ," -- " ,"    " ," -- " ," -- "] 
lists = [list0,list1,list2,list3,list4,list5,list6]
printLine lnum snum = putStr  (last (take snum (last(\
take lnum lists)))) >> putStr " "
char2printLine lnum str = printLine lnum ((digitToInt str)+1)
mapPrint str lnum = mapM_ (char2printLine lnum) str\
>>putStrLn ""
printDigit numStr = mapM_ ( mapPrint numStr) [1..7]

表示サイズの都合で、バックスラッシュを入れて改行しているところは、本当は1行で書いています。
文字と文字の間にスペース入れるとか、改行入れるとかに、なんとなく恥ずかしい処理が。(w

実行結果はこうなります。

*Main> printDigit "12345"
      --   --        --
   |    |    | |  | |
   |    |    | |  | |
      --   --   --   --
   | |       |    |    |
   | |       |    |    |
      --   --        --
*Main> printDigit "67890"
 --   --   --   --   --
|       | |  | |  | |  |
|       | |  | |  | |  |
 --        --   --
|  |    | |  |    | |  |
|  |    | |  |    | |  |
 --        --   --   --

Best of Ruby Quiz (Pragmatic Programmers)

Best of Ruby Quiz (Pragmatic Programmers)