今まで約5年間手続き型の世界でプログラミングして自分にとって謎の世界です。
変数の再代入不可のせいでどうプログラミングしていけばいいのか見えてこないのです。
いや、STモナド乱用すればできるのでしょうか、それってHaskellでやることって感じがするのですよね。
文法はなんとなく分かった気がするのですが、それをコードすることができないのです。
そこそこ実用的なHaskellのサンプルコードってないのですかね。
図書館で本借りてきてもいまいち要領掴めません。
Prologはもっと訳分かりません。brainf*ckの方がコード書けそうな気がしてくるレベル。
最早文法すらまともに理解できてません。
図書館で探してきても21世紀に書かれた本がないという・・・
結構大きい図書館なんですがね。
・・・実際にやるとなったらPrologの方が楽でしょうが。
以下HaskellでAOJ600の問題をやってみた結果です。
import Control.Applicative
import Control.Monad.State
readDataList :: Int -> IO [Int]
readDataList 0 = return []
readDataList n = (:) num list
where
num = read getLine :: IO Int
n_ = n - 1 :: Int
list = readDataList n_ :: IO [Int]
sprit :: [a]->Int->[[a]]
sprit list n= [take n list] ++ [drop n list]
allPattern :: [a]->Int->[[[a]]]
allPattern list 1 = [[list]]
allPattern list n =
(`execState` [] ) $ do
let length_ = length list :: Int
let last = length_ - (n - 1) ::Int
forM_ [1..last] $ \i->
let
front = take i list
back = drop i list
result = allPattern back $ n - 1
result_length= length result
in forM_ [0..result_length - 1] $ \j->
let
list = [front] ++ ( result !! j )
add = (list:)
in modify add
func list =
let
pattern = allPattern list 3
list1 = (`map` pattern) $ \list_->
(`map` list_) $ \list_1->
sum list_1
list2 = (`map` list1) $ \list_->
minimum list_
pattern1 = allPattern list 4
list11 = (`map` pattern1) $ \list_->
(`map` list_) $ \list_1->
sum list_1
list12 = (`map` list11) $ \list_->
let
length_ = length list_
list_1 = take (length_ - 1) list_
list_2 = drop 1 list_1
last=list_ !! (length_ - 1)
list_3 = ((list_!!0)+last):list_2
in list_3
list13 = (`map` list12) $ \list_->
minimum list_
in max (maximum list2) (maximum list13)
main = do
let num = read getLine :: IO Int
let list = readDataList = list
print =<< result