スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「変数に型がないということの利点について考える」について考える


「変数に型がないということの利点について考える」について考える


変数に型がないということの利点について考える
私はこの記事の内容には否定的で、結局テストに依存しているんじゃないかテストをきちんとすれば問題ないなと言っているだけに思えます。
(この辺りは別に書きたい)

今回は、内容とは別に、コメントが大量について燃え上りかけてた点についてに書きたいと思います。

記事を書いた人も、コメント欄や自分のブログで記事を書いていた人も、人格否定をすることなく、礼儀正しく対応していたので、その部分は評価しており、議論の結果も一応でて、沈静化しているのでよかったと思います。
しかし、議論の内容は複雑じゃないのに、まとまるまで時間がかかった理由何だろうと
考えた時、議論の方法に問題があったと考えます。

第一に前提条件があいまい


記事のタイトルが"変数に型が無いことの利点"であるのに、記事の中身が"動的型付け言語の利点"と
となっており、 記事の方向性も動的型付け言語には型が存在しないかのように書かれている点。

PHPやPerlやRubyやPythonなどのスクリプト言語に対して、
変数に型がないということを否定的にとらえる人もいるかと思います。
特にC言語やJavaなどの静的言語を使ってきた人にとっては、
型がないということが不安材料として目に映ることが多いのではないかと思います。

このように利点を述べる対象がPHP,Perl,Ruby,Pythonと動的型付け言語であり、型なし言語を対象にしていない点
かつ、これらの言語は型を持たない言語であるというようにミスリードさせる表現となっています。

ただ、私はこれらの言語の詳細を知らずwikipediaを参考に動的型付けと言ってるだけなので、本質的に型なし言語であるなら指摘してください。
(型あり、型なしについての論文や研究にも目を通していないので、にわか知識で書いています。)

また、対立軸がぶれている部分もあります。これはコメント中での議論で出てくる内容ですが、
PHP,Perlなどのメリットを説明する上での対立軸として、静的型付け言語を挙げており、著者の例はC,javaを挙げています。
なので、具体的にPHP,Perl,Ruby,PythonのメリットをC,javaと比較しようというのが今回の記事の目的のはずです。
が、コメント欄ではHaskellなどの型推論を持つ静的型付け言語を対立軸として挙げて記事の内容の一部を否定しようとしていた部分がありました。
もちろん、Haskellを議論の中で出すのは悪いことでは無いのですが、今回の記事の範囲から外れること明示しながら議論を進めるべきなのかなと思います。


反論の仕方が不適切


項目として挙げたけど、不適切な部分を細かく指摘するだけの能力が無かった.orz
ので一つだけ。
型がない言語、書いた人間のマインドモデルに依存しすぎるので、よっぽど優れたマインドモデル持ってないと辛い
(mizchiさん)

に対する反論として以下を挙げています。
それは静的な型がソースコードの中に見えれば、マインドモデルに依存しないといっているように聞こえます。
静的な型を持つ言語で書いても、ひどいソースコードはたくさんあります。


型が無い言語≒動的型付け言語という認識がみられますが、それは先ほど述べたので、置いときます。
ここでのmizchiさんの指摘は、よっぽど優れた人じゃないと型なし言語(≒動的型付け言語)は使えない
と言っているのに、
反論は型あり言語(≒静的型付け言語)で書いてもひどいコードが出来ますよ。である。
本来反論すべき内容は、優れていない人でも型なし言語(≒動的型付け言語)を使えるということを
説明すべきなのに、それをしていないという点です。


まとめ


上記のように元記事の、議論の展開の仕方にケチを付けたようになってしまったが、
冒頭に述べているように、元記事の筆者だけでなくコメント欄にコメントした人も十分に考えてコメントをしていた。
いわゆる炎上状態にならずに終息していったので、ノイズが少なく素敵な題材でした。

コーディング規約や言語の優劣については宗教戦争みたいな部分があるのですが、この元記事はそんな部分が無く動的言語の利点を説明している記事です。
(私は、間違いや認識違いはそれなりにあると感じているけれども。)

また、筆者のコメントへの対応も丁寧なので、コメントで得た情報をもとに勉強して修正記事を書くんじゃないと想像しています。その時の議論の仕方の参考にしてほしいと思って書きました。







スポンサーサイト

テーマ : 日々のつれづれ
ジャンル : 日記

cabal windows インストールできない

既知のバグのようですが(以下参照)

http://hackage.haskell.org/trac/hackage/ticket/922



windows上でcabalを使ってhaskellのライブラリをインストールするときに失敗するのでメモ。

【エラーメッセージ】
“lexical error (UTF-8 decoding error)”

【対策】
事前にLANGを変更してからcabal installを使う
set LANG=C

【原因】
???

テーマ : プログラミング
ジャンル : コンピュータ

逆ポーランド関数電卓

Haskell で逆ポーランド型の関数電卓(試作品)を作ってみました。
javaとかと違ってエラーを考慮して、型を定義しないといけないのでそれがちょっと面倒ですが、
面倒なのはそのくらいで基本的には楽にかけました。


{-
- 逆ポーランド型関数電卓
-
-}
import System.IO
import Data.Either
import Data.String
import Data.Maybe
import Data.List
import Data.Char

main :: IO()
main = getLine >>= calc
calc :: String -> IO()
calc str
| str == "q" = putStrLn str
| otherwise = putStrLn (calcCore ( parse $ words str)) >> main


parse :: [String] -> [Either String (Maybe Int)]
parse = map parse'
where
parse' :: String -> Either String (Maybe Int)
parse' str
| all isDigit str = Right (Just (read str))
| otherwise = Left str


calcCore :: [Either String (Maybe Int)]-> String
calcCore a = show $ head $ snd $ calcCore' (a,[])

calcCore' :: ([Either String (Maybe Int)],[Maybe Int]) -> ([Either String (Maybe Int)],[Maybe Int])
calcCore' ([],n) = ([],n)
calcCore' ((a:as), n) = calcCore' (as, (either (f1 n) (f2 n) a))

-- 演算子が入った時に演算する
f1 :: [Maybe Int] -> String -> [Maybe Int]
f1 (a:as) b = calc'' b a ( head as):tail as

-- スタックに積み込む
f2 :: [Maybe Int] -> Maybe Int -> [Maybe Int]
f2 a b = b:a


calc'' :: String -> Maybe Int -> Maybe Int -> Maybe Int
calc'' c (Just a) (Just b)
| c == "+" = Just ((+) a b)
| c == "-" = Just ((-) a b)
| c == "*" = Just ((*) a b)
| otherwise = Nothing
calc'' _ Nothing _ = Nothing
calc'' _ _ Nothing = Nothing

テーマ : プログラミング
ジャンル : コンピュータ

Functor Applicate Monad


ここ数日、FunctorとApplicateとMonadの違いがよくわからなかったので、
色々記事を探して読んだり、自分でコードを書いたりしていました。

以下の記事が参考になったので、メモ
■ [Haskell] The Typeclassopedia

まだ自分でまとまっていない部分が多いですが、
FunctorとかApplicateとかMonadとか言ってるけど結局は型の使い方を分類&整理したものなんだなーと
で、その整理の仕方が数学と結びついているから難しく見えるんだなって思った次第です。

テーマ : プログラミング
ジャンル : コンピュータ

[覚え書き]TryEnterCriticalSection()について

TryEnterCriticalSection()はwindowsのバージョンによって使えたり使えなかったりするみたい。
2000以降なら使えるので
#define _WIN32_WINNT 0x0500
定義して対象の環境が2000以降であることを明示的に示す必要があるようです。
http://msdn.microsoft.com/ja-jp/library/aa383745.aspx


/**************************
TryEnterCriticalSection()が使えるかどうかの確認のためのソースコード
***************************/
#pragma comment(lib,"winmm.lib")
//ここのdefineを忘れるとコンパイルエラーになる
#define _WIN32_WINNT 0x0500
#include
#include
#include


CRITICAL_SECTION critical;


unsigned int __stdcall ThreadFunc(void* p_num )
{
volatile int* num = reinterpret_cast(p_num);

int a =0;
while(*num)
{
// ここのTryEnterCriticalSection()のためにコンパイルエラーが起きる
BOOL flag = TryEnterCriticalSection(&critical);
if(flag ==TRUE)
{
a++;
}
std::cout << a << std::endl;
Sleep(10);
}
std::cout << "end" << std::endl;
_endthreadex(0);
return 0;
}


int main()
{
int num;
uintptr_t thread;
InitializeCriticalSection(&critical);
thread = _beginthreadex( NULL,0,&ThreadFunc,&num,0,0);

::EnterCriticalSection(&critical);
Sleep(1000);
::LeaveCriticalSection(&critical);
Sleep(1000);
num =0;
Sleep(1000);
::DeleteCriticalSection(&critical);

return 0;
}
プロフィール

かみさまみならい

Author:かみさまみならい
FC2ブログへようこそ!

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。