2014-09-25 1 views
3
module Main where 
import Data.Char 
import Control.Monad 
import Control.Monad.Trans.Writer 
import Control.Applicative 
import Data.Monoid 

wt :: Int -> Writer Int [String] 
wt x=writer(["num:"++ show x],x) 


addw::Writer Int [String] 
addw = do 
     a <- wt 2 
     b <- wt 3 
     return (a*b) 

2 오류가 있습니다하스켈 (모노 이드 INT) 없음 예를 하스켈 플랫폼을 사용하는 작가 모나드 2013 2.0.0

No instance for (Monoid Int) arising from a do statement 
    Possible fix: add an instance declaration for (Monoid Int) 
    In a stmt of a 'do' block: a <- wt 2 
    In the expression: 
     do { a <- wt 2; 
      b <- wt 3; 
      return (a * b) } 
    In an equation for `addw': 
     addw 
      = do { a <- wt 2; 
       b <- wt 3; 
       return (a * b) } 


No instance for (Num [String]) arising from a use of `*' 
    Possible fix: add an instance declaration for (Num [String]) 
    In the first argument of `return', namely `(a * b)' 
    In a stmt of a 'do' block: return (a * b) 
    In the expression: 
     do { a <- wt 2; 
      b <- wt 3; 
      return (a * b) } 

나는 최신 eclipsefp, 하스켈 플랫폼 2013 이클립스 4.4 주노 사용 SumProduct : 2.0.0이 GHC 7.6.3 포함,이 코드는 중대한 좋은

답변

4

Int에 대한 당신에게 하스켈 내용에서 것은 두 가지 구현이 있습니다 becasuse, 그 자체로 Monoid 없습니다.

필요에 따라 둘 중 하나를 사용하십시오.


Oopsie. [String]Int을 교환하면됩니다. Monad에 대한 마지막 유형 매개 변수는 항상 생성되는 값입니다.

+0

효과가 있습니다. 중량 : INT-> 작가 [문자열] 지능 중량 X = 작가 : - 중량 addw :: 작가 [문자열] 지능 addw = 을 <(X, [ "NUM은"X 보여 ++]) 2 b <- wt 3 return (a * b) – doofin