2017-04-06 9 views
4

私はGHCiの内部のような関数を定義します。ghciのliftM:なぜそのような違いがありますか?

> :m Control.Monad 
> let f n = n+1 
> let g = liftM f 

彼らはうまく機能:

> g $ Just 2 
> Just 3 
> g $ [1,2] 
> [2,3] 

しかし、私は、ファイル内の同じ機能(probl.hs)を定義:

import Control.Monad 

f :: Integer -> Integer 
f n = n + 2 

g = liftM f 

をghci経由でこのファイルを実行してください。

ghci probl.hs 

私は、このようなメッセージが表示されました:

probl.hs:6:5: error: 
    * Ambiguous type variable `m0' arising from a use of `liftM' 
     prevents the constraint `(Monad m0)' from being solved. 
     Relevant bindings include 
     g :: m0 Integer -> m0 Integer (bound at probl.hs:6:1) 
... 
Failed, modules loaded: none. 

なぜ、このような違いがあるのでしょうか?そして、どのようにして第2の状況の問題を解決するか(私は最初のような同じ振る舞いを望みます)?

+0

私が今見ることができ、その答えは、単相性限定の話題に属しているが、疑問の点は、その中のGHCiの行動やliftMについてでした。私は少し違うと思う。 – Vladimir

答えて

3

あなたは恐ろしいモノモフィズムの制限に襲われています!これは、GHCiではオフになっているが、コンパイルすると直感的ではないルールです。タイプシグニチャ(推奨)、または{-# LANGUAGE NoMonomorphismRestriction #-}を使用して無効にします。基本的に、型シグネチャのない式は、多分あなたが期待するよりも多態的になります。

Further reading

関連する問題