Let's begin F#
Let's begin F#
Let's begin F#
ATOMRSS
部屋に参加

トピック:class or module

いげ太

いつクラスを使い、いつモジュールを使うのか。クラスとモジュールをどう使い分けていくかについて、みなさんのご意見を聞かせてください。

  • アクセス数:517件
  • コメント数:10件
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

コメント

ちなみに、このトピックは masaito5 さんのブログ エントリに影響を受けて立てたものです。

スタイルガイドラインについて
http://blog.livedoor.jp/masaito5/archives/148441.html

  • GoodJob
  • 0

OCamlユーザのほうがおそらく多いので、その人たちの意見も聞きたいところですね。

しかし、F#の場合は.Netのライブラリを扱う、F#で書いたプログラムが.Netの他の言語から呼び出されるという特殊事情がありますから、OCamlの場合とは違ってくるのかも知れません。

  • GoodJob
  • 0

おっしゃるとおりですね。とりわけ、「F# で作ったライブラリを C# から使う」というようなケースを想定しなければならないときなど、class を使う積極的な理由になるだろうと。

さらに輪をかけてややこしいのが、OCaml は structural な指向性を持っているが、F# は nonimal であるってところでしょうか。

僕は OCaml 使いでないので想像でしか言えないところではありますが、OCaml で object を使うときって、structural な polymorphism を行いたい、特に row polymorphism を使いたいってのが結構大きな動機になってるんじゃないだろうか?という気がしてます。

いわゆる多態的な機能を使いたいって欲求としては同じなのかもしれませんが、そこに流れているコンセプトというか、実現表現というかが違っているので、OCaml と F# では、OOP したくなる場面にびみょうなズレがあるかもしれないなぁと。

  • GoodJob
  • 0

ちなみに、F# の module は C# でいうところの static class です。.NET Reflector で答えが見れます。

#light "off"
namespace Igeta.ClassOrModule

type C = class
end;;

module M = begin
end;;
namespace Igeta.ClassOrModule
{
    [Serializable, CompilationMapping(SourceConstructFlags.ObjectType)]
    public class C
    {
    }

    [CompilationMapping(SourceConstructFlags.Module)]
    public static class M
    {
    }
}
だからといって、C# で static class を使う場面と、F# で module を必要とする場面が同じかというと、そうでもないような気がするんですよね。

  • GoodJob
  • 0

タイムリーすぎる記事を見つけたので貼っておきます。

オブジェクトは OCaml の鬼子 Oh, you `re no (fun → more)
http://d.hatena.ne.jp/camlspotter/20080906/1220723583

GJ

とってもタイムリーですね。O'Camlのコミュニティーでは確立した見解らしいので、それに従うのが初心者の私にはよさそうです。

実は私はScalaから流れてきました。あっちでは、もっとオブジェクトが前面に出ています。Scalaを勉強して、前から書きたかったプログラム(Javaでは放り出したやつ)を書いたら動いてしまったので、いったんはファンになりかけました。しかし、Scalaを勉強し続けていったところ、その複雑さに恐れをなすようになり、撤退することにしました。オブジェクトを使わず、モジュールだけを使うという方針でF#を扱うのは簡明でいいですね。

  • GoodJob
  • 0

実は私はScalaから流れてきました。
おお。ぜひ「F# vs Scala」みたいな記事を期待したい!なんて言ってみたり(^^

あっちでは、もっとオブジェクトが前面に出ています。
僕がそう感じてるという程度の話ですが。。。
Web でざっと調べた感じだと、Scala は純粋なオブジェクト指向言語といわれてて、言語設計的にもそうなってる気がしますね。OOP の上に FP を載せてる感じ。apply とか unapply とかその辺のしくみが特に。
んで、F# はというと、FP の上に OOP を載せてる感じがします。ちゃんというと、オブジェクト指向フレームワークである .NET の上に、関数型言語としての機能を組み上げ、その上で object を扱ってるような感じ。IL に落ちればまた違いますが、F# の上でプログラミングする限り、そう見えるように作られている。

オブジェクトを使わず、モジュールだけを使うという方針でF#を扱うのは簡明でいいですね。
ただし、F# にはファンクタがなく、ジェネリック クラスがその代りになってたりするので、一概に class types が不要とは言えないかなあ、とも思います。

  • GoodJob
  • 0

ScalaとF#の言語仕様はたしかに違いますが、実際に使ってみた感触はそれ
以上に違います。言語仕様もさることながら、ライブラリや本が漂わせて
いる雰囲気がだいぶ違うのを感じます。Scalaではクラスを使うのが当然
という雰囲気だし、F#ではむしろ使わないの普通という感じ。

たとえば、Microsoft.FSharp.Collectionsにあるものはほとんどimmutableで、
mutableな対応物はありません。しかし、Scalaだとmutableなものとimmutable
なものはだいたいセットで揃っています。

GJGJGJ

ScalaとF#の(中略)実際に使ってみた感触
これ、個人的にはぜひ聞いてみたかったところなので、すごくありがたい情報です。こういう生の声というか、各言語の空気感の違いに言及してる情報って滅多にないんですよね。というか、F# の情報が少なすぎるだけかもしれませんが(^^;

F# 標準ライブラリは、徹底して class の存在を意識させない作りになってますね。なにか object があったら、それはモジュール経由で扱えるようになっている。なんであれ(list, touple, record, union, class, etc...)type の傍にはそれに対応する module が定義されている。全部調べたわけではなですけど、見る限りほとんどそういう風に作られてます。

アプリケーション コードにおいて、class を定義する場面はごく稀であり、また、class の instance を意識しなければならない局面もあまりないのではないだろうか、と僕は感じています。

  • GoodJob
  • 0

F# 標準ライブラリは、徹底して class の存在を意識させない作りになってますね。
あー。もしかしたら、この一文は「class の存在を意識しないでいい使い方もできるようになっている」ぐらいの表現の方が適切かもしれない、と思い始めました。

http://research.microsoft.com/fsharp/manual/namespaces.html

再構築された F# CTP 名前空間のパッと見の感想です。FSharp.PowerPack アセンブリ に追いやられた types/modules というのは、使う必要性の乏しい types/modules のように見えます。丸ごとイラナイ判定されて持ってこられたものから、イラナイ関数だけを抜き取ってきて定義されたモジュールみたいなものまで、いろいろ存在します。

ここで特に、Microsoft.FSharp.Compatibility 以下の名前空間を見てみると、以前のバージョンでは気兼ねなく使用できたモジュール群に気づきます。別アセンブリの別名前空間に定義が移されたということは、CTP では、それらを使うのに、アセンブリ参照と、必要なら名前空間の open を行わねばならない、ということを意味します。

.NET ライブラリと重複する部分だから、という理由でそう変更されたのならわからなくもないのですが、この名前空間には Lazy モジュールなんかも含まれているのが解せません。Lazy 型が、FSharp.Core アセンブリの Microsoft.FSharp.Control 名前空間に存在するにもかかわらずです。対応関係にある型とモジュールが、それぞれ別のアセンブリ、別の名前空間に分けて定義されているのはなぜでしょうか。

いちいち深読みのしすぎなのかもしれませんが、上記の事実は、Lazy 型の値は OOP ライクにドットで繋げて member 関数によって操作するのが常道、というメッセージではないだろうかと。Lazy 型を FP のスタイルで扱いたいがために FSharp.PowerPack を参照しなければならないのなら、面倒というか、たすきに長しじゃないだろうかと。

標準ライブラリでさえ、OOP 的なシンタックスによって使用すべきか、FP 的なシンタックスによって使用すべきか、統一されていないのかもしれない、と漠然と思っています。ちなみにこれは、どっちかに統一しろという主張などではなく、ただの現状認識としてのお話です。しかも多分に曖昧な…(^^;

GJGJGJ

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

コメントする権限がありません