2016-11-06 4 views
4
Prelude> :t fmap (\x -> 2x) [] 
fmap (\x -> 2x) [] :: Num (t -> b) => [b] 

Prelude> :t fmap (\x -> 2 * x) [] 
fmap (\x -> 2 * x) [] :: Num b => [b] 

Prelude> :t 1 1 
1 1 :: (Num (t -> t1), Num t) => t1 

Prelude> :t 1 * 1 
1 * 1 :: Num a => a 

2xとの間に違いはありますか?2xと2 * xに違いはありますか?

Num (t -> t1) => t1の意味はなんですか?

+1

同様の状況についての質問:*タイプNum \(\ [Char \] - > t \)=> t *]のStrange Haskell式(http://stackoverflow.com/q/31503707/2751851) – duplode

答えて

6

2xと2 * xの間に相違はありますか?

はい。 2 * xは数字2に変数xを掛けたものです。 2 xは、リテラル値2fromInteger 2)を解釈して生成した関数を変数xに適用した結果です。

2はどのように機能ですか?あなたがインスタンスNum (t -> t1)を持っていれば、2 :: t -> t1を補間することができます。それは確かに関数です。これは可能ですが、よく使用されるライブラリにはこのようなNumインスタンスがありません。基本的に、このような型シグネチャのポップアップが表示されるときは、構文上の間違いが原因です。

EDIT:

だけで退屈な例として:

{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE FlexibleContexts #-} 

instance (Num a) => Num (a -> a) where 
    fromInteger n = \x -> ((fromInteger n) * x) 

とその利用:

*Main> (\x -> (2 :: Int -> Int) x) 5 
10 

はそこより良い例があります。 IIRC、レナートはS.O. 2 seconds * 5 hoursなどの表現のための機械を提供します。

関連する問題