2016-04-09 6 views
0

のは、考えてみましょう:どのようにして>> =を使って基本的なInt操作を連鎖させますか?

f :: Int 
f = return 64 >>= (\x -> x^2) >>= (\y -> y^2) 

GHCiのは、(四乗に結果を上げることによって、その後の二乗64)281,474,976,710,656に少なくとも関連

Couldn't match expected type `Int' with actual type `m0 b0' 
    In the expression: return 64 >>= (\ x -> x^2) >>= (\ y -> y^2) 
    In an equation for `f': 
     f = return 64 >>= (\ x -> x^2) >>= (\ y -> y^2) 
Failed, modules loaded: none. 

結果がどうあるべきかとの私のコードを拒否します。 私はこの問題を解決できません。そしてそれはモナドの誤解と関連している。助けてください。

+1

なぜでしょうか?プレーンint演算はモナドではありません。 –

+0

'(\ x - > x^2)>> =(\ y _ - > y^4)$ 64'がコンパイルされ、' 281474976710656'となっていることに注意してください。 – Michael

+0

@Michaelモナドは '(( - >)Int)'です: 'Int'を引数とし、' a'型を返す関数です。 – amalloy

答えて

4

(>> =)を参照する必要があります。それは型を持っています

(>>=) :: Monad m => m a -> (a -> m b) -> m b 

英語で:(>> =)の第2引数は、モナドの値を生成する関数でなければなりません。あなたの関数は単に数値を生成します。

fIntとなるため、混乱が生じます。しかし、コンパイラは、(>> =)がm b このようにエラーメッセージを返すことを知っている:あなたの注釈のそれがIntを見つけると期待するので、しかし、すべてのそれはfためのコードがのために正しいことができることをm0 b0

注意しました(^)の実用的な実装とモナドの両方である型です。しかし、Intはそのようなタイプではありません。

何がしたいことは、おそらくです:

f = return 64 >>= pure . (^2) >>= pure . (^4) 

または

f = (\x -> (x^2)^4) <$> return 64 

しかし、これはまだいくつかのモナドに平野IntしかしIntではありません!したがって:

f :: Monad m => m Int 

(私はあなたがこれを実際にコンパイルするために単相性制限をオフにする必要がありますね。)

+0

ありがとうございました。 '<$>' – Gilgamesz

+0

@Gilgameszとはどういう意味ですか? 'fmap'と同じことをする中置演算子です。 – Ingo

関連する問題