2016-04-26 2 views
0

ステータスバーにtaffybarを使用しようとしています(設定はコードなので、Dyreフレームワークを使用しています)。それは、ネットワークインターフェイスの統計情報を表示できるウィジェットを持っています。デフォルト設定では、このウィジェットはコンパイル時にStringを必要とします。私は代わりにウィジェット(非ループバック)インターフェイスを動的に作成する必要があります。Haskell:FSから "動的に"タフィバーのウィジェットを作成することを読む

これは私がこれまで持っているものです:私は、次のコンパイラエラーまでだ。この時点で

listNetworkDevices :: IO [String] 
listNetworkDevices = fmap (map takeBaseName) $ getDirectoryContents "/sys/class/net/" 

filterOutLoopback :: [String] -> [String] 
filterOutLoopback = filter (\y -> not (elem y ["", ".", "lo"])) 

netDevList :: IO [String] 
netDevList = fmap filterOutLoopback listNetworkDevices 

... 

let nets = fmap (fmap (netMonitorNew 1)) netDevList 
    ... 
defaultTaffybar defaultTaffybarConfig { 
    ... 
    endWidgets = [ tray, clock, mem, cpu] ++ nets ++ [ bat ] 
} 

Couldn't match expected type ‘[IO gtk-0.14.2:Graphics.UI.Gtk.Types.Widget]’ 
      with actual type ‘IO [IO gtk-0.14.2:Graphics.UI.Gtk.Types.Widget]’ 

私が作っているので、全体的にこのエラーが理にかなっていますStringのうちIO Widgetです。従ってIO [String]IO [IO Widget]に変わります。

私が理解できないことは、これを避ける方法です。明らかにどこかで間違っていたはずですが、私はどこを見ることができません。私はどのように言葉で問題を置くかもわかりません。私はどんな指針にもうれしいだろう!

関連材料:

編集:完全なリスト:

import System.Taffybar 
import System.Taffybar.Systray 
import System.Taffybar.Pager 
import System.Taffybar.TaffyPager 
import System.Taffybar.SimpleClock 
import System.Taffybar.Battery 
import System.Taffybar.NetMonitor 
import System.Taffybar.Weather 
import System.Taffybar.Widgets.PollingBar 
import System.Taffybar.Widgets.PollingGraph 
import System.Information.Memory 
import System.Information.CPU 
import System.Directory (getDirectoryContents) 
import System.FilePath (takeBaseName) 
import Control.Monad 

memCallback = do 
    mi <- parseMeminfo 
    return [memoryUsedRatio mi] 

cpuCallback = do 
    (userLoad, systemLoad, totalLoad) <- cpuLoad 
    return [totalLoad, systemLoad] 

listNetworkDevices :: IO [String] 
listNetworkDevices = fmap (map takeBaseName) $ getDirectoryContents "/sys/class/net/" 

filterOutLoopback :: [String] -> [String] 
filterOutLoopback = filter (\y -> not (elem y ["", ".", "lo"])) 

netDevList :: IO [String] 
netDevList = fmap filterOutLoopback listNetworkDevices 

myPagerConfig = defaultPagerConfig {} 

main = do 
    let memCfg = defaultGraphConfig { graphDataColors = [(1, 0, 0, 1)] } 
     cpuCfg = defaultGraphConfig { graphDataColors = [ (0, 1, 0, 1) 
                 , (1, 0, 1, 0.5) 
                 ] 
            } 
     clock = textClockNew Nothing "<span fgcolor='orange'>%a %b %d %H:%M</span>" 1 
     pager = taffyPagerNew myPagerConfig 
     mem = pollingGraphNew memCfg 1 memCallback 
     cpu = pollingGraphNew cpuCfg 1 cpuCallback 
     bat = textBatteryNew "$percentage$% $time$" 1 
     tray = systrayNew 

     --nets = [ netMonitorNew 1 "wlp0s2" ] 
     nets = fmap (fmap (netMonitorNew 1)) netDevList 

    defaultTaffybar defaultTaffybarConfig { startWidgets = [ pager ] 
             , endWidgets = [ tray, clock, mem, cpu] ++ nets ++ [ bat ] 
             } 

編集:エラーメッセージ:

.config/taffybar/taffybar.hs: 
    Couldn't match expected type ‘[IO 
            gtk-0.14.2:Graphics.UI.Gtk.Types.Widget]’ 
       with actual type ‘IO [IO gtk-0.14.2:Graphics.UI.Gtk.Types.Widget]’ 
    In the first argument of ‘(++)’, namely ‘nets’ 
    In the second argument of ‘(++)’, namely ‘nets ++ [bat]’ 
+0

あなたは完全なエラーメッセージとエラーをスローし、完全なソースコードの機能を追加することができます。また、あなたのソースコードが間違っていると思います。 'let'文はファイル内では意味がありません。 – epsilonhalbe

+0

@epsilonhalbe:done。 – McEnroe

+0

私はコードを徹底的に勉強していませんが、私の推測はmemcallbackかcpucallbackが間違っている(型シグネチャを追加する)か、 'nets ='は 'nets <-'でなければなりません – epsilonhalbe

答えて

1

私は通常そうであるように、私はtaffybarがこのマシンにインストールされていないが、私は以下の小さな変更はあなたが進歩を遂げるに役立つはず疑いがあるため、私は、これをテストしていません。

main = do 
    let memCfg = defaultGraphConfig { graphDataColors = [(1, 0, 0, 1)] } 
     cpuCfg = defaultGraphConfig { graphDataColors = [ (0, 1, 0, 1) 
                 , (1, 0, 1, 0.5) 
                 ] 
            } 
     clock = textClockNew Nothing "<span fgcolor='orange'>%a %b %d %H:%M</span>" 1 
     pager = taffyPagerNew myPagerConfig 
     mem = pollingGraphNew memCfg 1 memCallback 
     cpu = pollingGraphNew cpuCfg 1 cpuCallback 
     bat = textBatteryNew "$percentage$% $time$" 1 
     tray = systrayNew 

    -- this line is the only one that changed 
    nets <- fmap (fmap (netMonitorNew 1)) netDevList 

    defaultTaffybar defaultTaffybarConfig { startWidgets = [ pager ] 
             , endWidgets = [ tray, clock, mem, cpu] ++ nets ++ [ bat ] 
             } 

その他の問題がある可能性がありますが、これは質問に記載されている問題に対処する必要があります。

もちろん、作成することもできますし、作成する必要がある多くの文体の変更があります。例えば、私はおそらくこの方法の代わりに、最後の2行を書くと思います:

nets <- netDevList 
    defaultTaffybar ... { ..., endWidgets = ... ++ map netMonitorNew nets ++ ... } 
+0

ありがとう、これは確かに問題を解決します。あなたが文章で2つの言葉でコメントすることができたと思いますか?私はまだHaskellのコードについて話す言語を開発しようとしています。 – McEnroe

+0

@McEnroeあなたはsigfpeの[IOの紹介](http://blog.sigfpe.com/2007/11/io-monad-for-people-who-simply-dont.html)が好きかもしれません。 –

関連する問題