标签: pattern-guards

如何让Haskell中的函数依赖于其参数的类型?

我尝试写一个变体show来处理字符串与其他实例不同Show,不包括"并直接返回字符串.但我不知道怎么做.模式匹配?警卫?我找不到任何关于在任何文件中.

这是我试过的,不编译的:

show_ :: Show a => a -> String
show_ (x :: String) = x
show_ x             = show x
Run Code Online (Sandbox Code Playgroud)

haskell types pattern-matching pattern-guards

4
推荐指数
1
解决办法
227
查看次数

Haskell中的模糊模式匹配调度

我正在树上写一些解析代码.(即斯坦福nlp依赖树)

基本上我有这样的功能:

m :: DepTree -> Logic
m (w, [E "nsubj" nsubj, E "dobj" dobj]) = ...
m (w, [E "nsubj" nsubj, E "prep" prep]) = ...
m (w, [E "nsubj" nsubj]) = ...
m (_, []) = error "No rules apply"
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果节点有一个nsubj和一个dobj边缘出来,则调度到第一个规则.我不在乎它可能有什么.

很明显,我的示例函数不会这样做,因为它要求边以正确的顺序存在,如果存在更多的边,它将不匹配.

一种方法可能是使用警卫来提高表现力,我可以这样做:

m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ...
          | ...
          | otherwise = error ...
Run Code Online (Sandbox Code Playgroud)

但这更加富有成效,我甚至无法处理目标节点.

是否有一种标准方法可以像我一样在图形上编写模式匹配解析器?或者也许是基于Maybe monad的魔法......?

tree haskell pattern-matching maybe pattern-guards

2
推荐指数
1
解决办法
230
查看次数

如何在状态monad的字段上匹配匹配?

是否可以a使用pattens匹配/保护写入函数?

{-# LANGUAGE PatternGuards #-}
import Control.Monad.State.Strict(State, gets, runStateT)
data MyState = MyState
    { counter :: Int
    } deriving (Show)


a :: State MyState String
a = do
    i <- gets counter
    case i of
        0 -> return "hello"
        1 -> return "bye"

run = runStateT a ( MyState{counter=0} )
Run Code Online (Sandbox Code Playgroud)

我试着写a

a' :: State MyState String
a' | i <- gets counter, i == 0 = return "hello"
Run Code Online (Sandbox Code Playgroud)

但得到了错误:

No instance for (Control.Monad.State.Class.MonadState MyState m0)
  arising …
Run Code Online (Sandbox Code Playgroud)

haskell pattern-matching state-monad pattern-guards

2
推荐指数
1
解决办法
409
查看次数

Erlang/Elixir守卫和arity

有没有办法看到函数的守卫而没有看到源代码?

给出一个示例函数(在Elixir中):

def divide(x, y) when y != 0 do
  x / y
end
Run Code Online (Sandbox Code Playgroud)

怎么会弄清楚在没有访问源代码的情况下有一个分区/ 2的守卫,以及如何找到关于该守卫的信息或者后卫对模式匹配的预期?

我正在观看来自Ruby Conf 2014的Chris McCord(Elixir凤凰框架的创建者)的演讲.在演讲中,克里斯正在描述警卫,并且有人问是否有办法检查可以显示该功能的警卫的功能.

这是谈话的问题:

https://www.youtube.com/watch?v=5kYmOyJjGDM&t=5188

视频t =时间后不久就会问这个问题.

erlang elixir arity pattern-guards

2
推荐指数
1
解决办法
396
查看次数

建议的ScopedTypeVariables在模式类型签名中

我开始编写Haskell代码.我试图用卫兵写一个斐波纳契函数 -

    fibo :: (Num z, Ord z) => z -> z
    fibo d
    | d <= 0 = 0
    | d == 1 = 1
    | otherwise = fibo (d-1) + fibo (d-2)
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误: -

非法类型签名:'(Num z,Ord z)=> z - > z fibo d'也许您打算在模式类型签名中使用ScopedTypeVariables

然而另一个功能 - 复制我用类似的方式编写,编译和工作正常.我可以用另一种方式写斐波纳契,但我想知道错误是什么

haskell pattern-guards

1
推荐指数
1
解决办法
3133
查看次数

Haskell:绑定模式匹配的地方

目前我正在尝试通过在线教程学习Haskell来学习Haskell.在"函数中的语法"一章中,作者写道"你也可以使用绑定到模式匹配的地方!".之后有一部分代码示例,但我不知道模式匹配与新的where绑定一起使用的位置.因为代码块的第一部分被缩短了("我们可以将我们之前函数的where部分重写为"),你只能推断它,但我认为我选择了正确的部分.

功能:

bmiTell :: (RealFloat a) => a -> a -> String  
bmiTell weight height  
    | bmi <= skinny = "You're underweight, you emo, you!"  
    | bmi <= normal = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | bmi <= fat    = "You're fat! Lose some weight, fatty!"  
    | otherwise     = "You're a whale, congratulations!"  
    where bmi = weight / height ^ 2  
          skinny = 18.5  
          normal = 25.0  
          fat = 30.0
Run Code Online (Sandbox Code Playgroud)

要替换的新where部分:

where bmi = weight …
Run Code Online (Sandbox Code Playgroud)

haskell pattern-matching pattern-guards

1
推荐指数
1
解决办法
214
查看次数

Haskell - 用Guards定义函数

我是Haskell的新手,正在进行模拟棋子的任务.我在确定有条件地检查表达式和更新元组值的正确方法时遇到了一些困难.我有一个名为getPos的函数,它将在板上的特定位置返回Char以确定其状态.

    onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])

    onemove     (a,b,c,(d,e)) 
       | e <= 0 =(a-30,b,c)
       | e > 50 =(a-30,b,c)
       | (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) == 'true'  =(a-20,b,c)
       | (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i')))== 'true' =(a-20,b,c)
       | otherwise = (1000,b,c)
       where posFrom = getPos (d, c)
             posTo =  getPos (e,c)
Run Code Online (Sandbox Code Playgroud)

使用函数在where子句中定义变量是否正确?我在最后一行收到以下错误:

    parse error on input `='
Run Code Online (Sandbox Code Playgroud)

haskell function pattern-guards

0
推荐指数
1
解决办法
182
查看次数