ステータスバーに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]
に変わります。
私が理解できないことは、これを避ける方法です。明らかにどこかで間違っていたはずですが、私はどこを見ることができません。私はどのように言葉で問題を置くかもわかりません。私はどんな指針にもうれしいだろう!
関連材料:
- endWidgetsドキュメント:https://hackage.haskell.org/package/taffybar-0.4.6/docs/System-Taffybar.html#v:endWidgets
- netMonitorNewドキュメント:githubの上https://hackage.haskell.org/package/taffybar-0.4.6/docs/System-Taffybar-NetMonitor.html#v:netMonitorNew
- 出典:https://github.com/travitch/taffybar/tree/master/src/System/Taffybar
編集:完全なリスト:
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]’
あなたは完全なエラーメッセージとエラーをスローし、完全なソースコードの機能を追加することができます。また、あなたのソースコードが間違っていると思います。 'let'文はファイル内では意味がありません。 – epsilonhalbe
@epsilonhalbe:done。 – McEnroe
私はコードを徹底的に勉強していませんが、私の推測はmemcallbackかcpucallbackが間違っている(型シグネチャを追加する)か、 'nets ='は 'nets <-'でなければなりません – epsilonhalbe