2012-01-15 8 views
1

最近、Haskellを勉強していて、OOPメソッドのような関数を使ってアイディアを得ました。HaskellのOOPメソッドのような関数を使う

まず、以下のような演算子を定義します。あなたが見ることができるように

(//) :: a -> (a -> b) -> b 
x // f = f x 

は、このオペレータはxは、それを適用する関数fと引数の順序が逆になります。たとえば、equalsは、次のように定義できます。

equals :: Eq a => a -> a -> Bool 
equals = \x -> \y -> x == y 

comparison = (1 + 2) // equals 3 -- True 

ここに私の質問があります。 OOPメソッドのようなハスケル関数を使った良いアプローチですか?これは、関数の逆転を意味し、(最初の)引数は良いかどうかです。ここ

UPDATE

はバッククォートの場合(`)が利用可能でないからです。

data Person = Person { name :: String } 
myself = Person "leafriend" 

はその後

> name myself 
"leafriend" 
> myself // name 
"lefirend" 
> myself `name` 
ERROR - Syntax error in expression (unexpected end of input) 
+9

これはOOPではない、単なる文法的な奇妙なものです。もしあなたが "equals"というメソッドに対して '1 + 2'の結果を求め、その結果と' 3'を引数として呼び出すのであれば、OOPになります。 – delnan

+4

'//'を定義する必要はありません。ハスケルでは 'f a b'は' 'f'' b''と書くことができるので、' 'comparison =(1 + 2)' 'は' '3''と書くことができます。 – kennytm

+0

delnan //はい、そうです。これはOOPではなく、構文が異なるだけです。私の質問はただの好奇心からです。 – leafriend

答えて

2

何が書かれていることは、単にスタイルの問題です。 (しかし、オペレーターとして//を使用するC/Javaプログラマにかなり残酷なようだ。)私はいくつかの理由のためにこれを使用して思いとどまらなり、主な理由:それは慣用的Haskellのではない、としようとして任意のHaskellersを混乱させます

  • あなたはHaskellはより多くのあなたの好きなOOP言語のように見えるようにしようとしている場合、あなたは間違ってそれをやっているOOP言語

を考えると同じようにあなたのコード

  • を読むためにあなたはHaskellのを考えるべきではありません。ハスケルは、数式のように見えます:接頭辞関数のアプリケーションを持つlisp-yのようなものですが、利用可能な関数や演算子もあります。

  • +0

    ありがとうございました。私はハスケルの大会に精通しています。 – leafriend

    +1

    @リーフフレンド - [ハスケルを学ぶ](http:// learnyouahaskell。com /)と[Real World Haskell](http://book.realworldhaskell.org/)は新しいHaskellersに強くお勧めします。 –

    関連する問題