Haskell 如何使用XMonad显示MPD卷
我正在尝试使用haskell libmpd读取XMonad中的MPD卷。而独立代码:Haskell 如何使用XMonad显示MPD卷,haskell,xmonad,Haskell,Xmonad,我正在尝试使用haskell libmpd读取XMonad中的MPD卷。而独立代码: -- current darcs as of 2010-12-31 {-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, NoMonomorphismRestriction, PatternGuards, Sco
-- current darcs as of 2010-12-31
{-# LANGUAGE
DeriveDataTypeable,
FlexibleContexts,
FlexibleInstances,
MultiParamTypeClasses,
NoMonomorphismRestriction,
PatternGuards,
ScopedTypeVariables,
TypeSynonymInstances,
UndecidableInstances,
OverloadedStrings
#-}
{-# OPTIONS_GHC -W -fwarn-unused-imports -fno-warn-missing-signatures #-}
import Control.Applicative
import Control.Monad
import Control.Monad.Instances ()
import Control.Monad.Writer
import Control.Monad.Trans (liftIO)
import Data.List
import Data.Int
import Data.Maybe
import Data.Either
import Data.Either.Utils
import Data.Traversable(traverse)
import qualified Data.Map as M
import System.IO
import System.Environment (getArgs)
import System.Process
import Prelude
import Text.Regex.Posix
import qualified Network.MPD as MPD
import qualified Network.MPD.Commands.Extensions as MPD
import Data.Array
import System.Cmd
int2str :: (Show a, Num a, Ord a) => a -> String
int2str x = if x < 10 then '0':sx else sx where sx = show x
parseMPD :: MPD.Response MPD.Status -> [[String]]
parseMPD (Left e) = return $ show e:repeat ""
parseMPD (Right st) = do
return [vol, "%"]
where
vol = int2str $ MPD.stVolume st
-- song = MPD.withMPD MPD.currentSong
main = do
x <- MPD.withMPD $ MPD.status
let a = unwords (foldr1 (++) (parseMPD x))
rawSystem "notify-send" ["MPD Volume", a]
——截至2010年12月31日的现行DARC
{-#语言
可派生数据类型,
灵活的语境,
灵活的实例,
多线程类型类,
非线性同态约束,
卫兵们,
ScopedTypeVariables,
例如,
不可判定的例子,
重载字符串
#-}
{-#OPTIONS#u GHC-W-fwarn未使用的导入-fno警告缺少签名#-}
导入控制
进口管制
导入Control.Monad.Instances()
导入控制.Monad.Writer
进口控制单体转运(liftIO)
导入数据。列表
导入数据.Int
导入数据,也许吧
导入数据。或者
导入Data.other.Utils
导入数据。可遍历(遍历)
导入符合条件的数据。映射为M
导入系统.IO
导入System.Environment(getArgs)
导入系统。进程
进口序曲
导入Text.Regex.Posix
将合格的Network.MPD导入为MPD
将合格的Network.MPD.Commands.Extensions作为MPD导入
导入数据。数组
导入系统.Cmd
int2str::(显示a、数字a、Ord a)=>a->字符串
int2str x=如果x<10,则为“0”:sx else sx,其中sx=显示x
parseMPD::MPD.Response MPD.Status->[[String]]
parseMPD(左e)=返回$show e:重复“”
parseMPD(右st)=do
返回[vol,“%”
哪里
vol=int2str$MPD.stVolume st
--歌曲=MPD.withMPD MPD.currentSong
main=do
x a->字符串
int2str x=如果x<10,则为“0”:sx else sx,其中sx=显示x
parseMPD::MPD.Response MPD.Status->[[String]]
parseMPD(左e)=返回$show e:重复“”
parseMPD(右st)=do
返回[vol,“%”
哪里
vol=int2str$MPD.stVolume st
卷::MonadIO m=>m()
音量=do
x m()
圣诞节时,hs:180:11-26
`m'是一个刚性类型变量,由
volume::MonadIO m=>m()的类型签名
在圣诞节时,hs:180:11
预期类型:m(MPD.Response MPD.Status)
实际类型:IO(MPD.Response MPD.Status)
在“do”块的stmt中:x回答:你在xmonad配置中没有使用相同的代码,你这个骗子!您为卷
添加了绑定。不过,不要担心,它应该很容易修复:您可以使用liftIO将任何ioa
操作转换为MonadIO m=>ma
操作:
volume :: MonadIO m => m()
volume = do
x <- liftIO . MPD.withMPD $ MPD.status
let a = unwords (foldr1 (++) (parseMPD x))
safeSpawn "notify-send" ["MPD Volume", a]
volume::MonadIO m=>m()
音量=do
x
xmonad.hs:182:14:
Could not deduce (m ~ IO)
from the context (MonadIO m)
bound by the type signature for volume :: MonadIO m => m ()
at xmonad.hs:180:11-26
`m' is a rigid type variable bound by
the type signature for volume :: MonadIO m => m ()
at xmonad.hs:180:11
Expected type: m (MPD.Response MPD.Status)
Actual type: IO (MPD.Response MPD.Status)
In a stmt of a 'do' block: x <- MPD.withMPD $ MPD.status
In the expression:
do { x <- MPD.withMPD $ MPD.status;
let a = unwords (foldr1 (++) (parseMPD x));
safeSpawn "notify-send" ["MPD Volume", a] }
In an equation for `volume':
volume
= do { x <- MPD.withMPD $ MPD.status;
let a = ...;
safeSpawn "notify-send" ["MPD Volume", ....] }
volume :: MonadIO m => m()
volume = do
x <- liftIO . MPD.withMPD $ MPD.status
let a = unwords (foldr1 (++) (parseMPD x))
safeSpawn "notify-send" ["MPD Volume", a]